/** * 配置文件压缩为字符串 * 支持key-string,key-number,key-Array * */ //配置示例: let testconfig = { key1: 0, key2: "111", key3: [1, 2, 3], key4: ['4', '5', '6'], key5: [ { subkey1: 1, subkey2: '2', subkey3: [1, 2, 3], subkey4: ['4', '5', '6'] }, { subkey1: 11, subkey2: '22', subkey3: [11, 22, 33], subkey4: ['44', '55', '66'] }, { subkey1: 111, subkey2: '222', subkey3: [111, 222, 333], subkey4: ['444', '555', '666'] } ] } var sign_arr = '?@#$%‘’'; var sign_obj = '@#~^:¥£'; var configNames = ['testconfig']; compress({ testconfig: testconfig }); /** * 压缩服务端配置数据,测试或服务器使用,支持key-string,key-number,key-Array * @param configs 所有配置 * @returns 压缩后的数据 */ function compress(configs) { for (let configkey in configs) { let configdata = configs[configkey]; if (configNames.indexOf(configkey) != -1) { console.log("压缩前数据:",configs); configs[configkey] = getCompresssStr(configkey, configdata); console.log("压缩后数据:",configs); } } } /** * 遍历对象,组装成字符串 * @param key * @param value * @param signindex * @returns */ function getCompresssStr(key, value, signindex = 0) { let props = []; if (value instanceof Array) {//数组类型压缩 let str = ''; for (let i = 0; i < value.length; i++) { str += getCompresssStr(key, value[i], signindex + 1) + sign_arr[signindex]; } return str.slice(0, str.length - 1); } else if (value instanceof Object) {//Object类型压缩 for (let i in value) { props.push({ key: i, value: getCompresssStr(i, value[i], signindex + 1) }); } } else {//基础类型直接返回 return value; } //对象内数据按key的字母升序排列 props.sort((a, b) => { let key1 = a.key; let key2 = b.key; let len = key1.length < key2.length ? key1.length : key2.length; for (let i = 0; i < len; i++) { if (key1.charCodeAt(i) < key2.charCodeAt(i)) { return -1; } else if (key1.charCodeAt(i) > key2.charCodeAt(i)) { return 1; } } }); //转换成字符串 let str = ''; let sign = sign_obj.charAt(signindex); for (let i = 0; i < props.length; i++) { str += props[i].value + sign; } //去掉最后一个多余的分隔符 str = str.slice(0, str.length - 1); return str; }