| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108 |
- /**
- * 配置文件压缩为字符串
- * 支持key-string,key-number,key-Array<string/number>
- *
- */
- //配置示例:
- 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<string/number>
- * @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;
- }
|