需求描述
现需要将简易对象(属性值仅为数字/字符串)转换为尽可能短的字符串进行传递。
代码实现
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; }