需求描述
现需要将简易对象(属性值仅为数字/字符串)转换为尽可能短的字符串进行传递。
代码实现
let oldObj = {
a: 1,
b: "2",
};
console.log("原对象", oldObj);
let oldObjStr = JSON.stringify(oldObj);
console.log("原对象字符串", oldObjStr, "长度为:", oldObjStr.length);
function obj2str(oldObj) {
let newObjStr = "";
Object.keys(oldObj).forEach((key) => {
let value = oldObj[key];
if (typeof value === "number") {
value = "$" + value;
}
newObjStr = newObjStr + "^" + key + "=" + value;
});
return newObjStr;
}
let newObjStr = obj2str(oldObj);
console.log("新对象字符串", newObjStr, "长度为:", newObjStr.length);
function str2obj(str) {
// 按 ^ 分隔字符串
var key_ValueList = str.split("^");
var obj = {
};
var keyValueList;
key_ValueList.forEach(function (ele, index) {
// 按 = 分隔字符串
keyValueList = key_ValueList[index].split("=");
if (keyValueList && keyValueList.length === 2 && keyValueList[0]) {
var newValue = keyValueList[1];
// 以 $ 开头的字符串变对象后,数据类型为数字
if (newValue[0] === "$") {
newValue = Number(newValue.substring(1));
}
obj[keyValueList[0]] = newValue;
}
});
return obj;
}
let newObj = str2obj(newObjStr);
console.log("恢复后的对象", newObj);
效果如下:
原对象 {
a: 1, b: '2' }
原对象字符串 {
"a":1,"b":"2"} 长度为: 15
新对象字符串 ^a=$1^b=2 长度为: 9
恢复后的对象 {
a: 1, b: '2' }
函数封装
简易对象转指定格式的字符串
function obj2str(oldObj) {
let newObjStr = "";
Object.keys(oldObj).forEach((key) => {
let value = oldObj[key];
if (typeof value === "number") {
value = "$" + value;
}
newObjStr = newObjStr + "^" + key + "=" + value;
});
return newObjStr;
}
指定格式的字符串恢复为简易对象
function str2obj(str) {
// 按 ^ 分隔字符串
var key_ValueList = str.split("^");
var obj = {
};
var keyValueList;
key_ValueList.forEach(function (ele, index) {
// 按 = 分隔字符串
keyValueList = key_ValueList[index].split("=");
if (keyValueList && keyValueList.length === 2 && keyValueList[0]) {
var newValue = keyValueList[1];
// 以 $ 开头的字符串变对象后,数据类型为数字
if (newValue[0] === "$") {
newValue = Number(newValue.substring(1));
}
obj[keyValueList[0]] = newValue;
}
});
return obj;
}