更改json节点key
json节点key更改,给朋友写的小tool,顺便记录一下
单个指定
每一个需要修改的key,都需要指定
/** * 需要转义的key对象 * 原key: 新key */ const jsonKeysTo = { 'a': 'new_a', 'b': 'new_b', 'c>0>a': 'new_c' }; /** * 数据对象 */ let json = { a: 'aaa', b: 123, c: [ { a: 1, f: 2 },{ a: 1 } ] }; /** * 遍历并替换key * @param {Object} root 当前遍历对象 * @param {Object} path 当前遍历节点路径 * @param {Object} data_source 源数据对象 */ function jsonNodeRead(root, path, data_source) { let tpkey; if (!path) { path = []; } if (!data_source) { data_source = root; } Object.keys(root).forEach(k => { if (typeof root[k] == 'object') { // 如果是对象则继续遍历 jsonNodeRead(root[k], path.concat(k), data_source); } else { jsonNodeTo(data_source, path.concat(k)); } }); } /** * @param {Object} root 数据源 * @param {Object} path 节点路径(数组) */ function jsonNodeTo(root, path) { let toKey = path.join('>'); if (jsonKeysTo.hasOwnProperty(toKey)) { let tp = eval('root["' + path.join('"]["') + '"]'); // 取出节点对象 eval('delete root["' + path.join('"]["') + '"]'); // 删除节点 path.pop(); // 删除最后一个元素 path.push(jsonKeysTo[toKey]); // 追加元素 eval('root["' + path.join('"]["') + '"] = tp'); // 添加节点 } } console.log(JSON.parse(JSON.stringify(json))); jsonNodeRead(json); console.log(json);
模糊匹配
用的是正则匹配,可能含有小bug
/** * 需要转义的key对象 * 原key -> 新key * 原key: >指向子节点,杠*杠为通配符,key最终转为正则对象 * 新key: 字符串 */ const jsonKeysTo = { 'a': 'new_a', 'b': 'new_b', 'c>/*/>a': '3_c', 'c>/*/>/*/>a': '4_c' }; /** * 数据对象 * key内不能含有>符号 */ let json = { a: 'aaa', b: 123, c: [ { a: 1, f: 2 },{ a: 1, f: 2, 'd发!!。、——1': { a: 123 } } ] }; /** * 遍历并替换key * @param {Object} root 当前遍历对象 * @param {Object} path 当前遍历节点路径 * @param {Object} data_source 源数据对象 */ function jsonNodeRead(root, path, data_source) { let tpkey; if (!path) { path = []; } if (!data_source) { data_source = root; } Object.keys(root).forEach(k => { if (typeof root[k] == 'object') { // 如果是对象则继续遍历 jsonNodeRead(root[k], path.concat(k), data_source); } else { jsonNodeTo(data_source, path.concat(k)); } }); } /** * @param {Object} root 数据源 * @param {Object} path 节点路径(数组) */ function jsonNodeTo(root, path) { let toKey = path.join('>'), toVal; let keys = Object.keys(jsonKeysTo); let toRegex = '[\\u4e00-\\u9fa5\\d\\w\\s\\-\\_\\+\\^\\$\\|\\&\\*\\?\\.\\(\\)\\{\\}\\[\\]~@#%=<!!。—《》【】‘“::、,,?]+'; let to = false; for(let i = 0; i < keys.length; i++) { // console.log('^' + keys[i].replace(/\/\*\//g, toRegex) + '$', ' --> ', toKey); if (new RegExp('^' + keys[i].replace(/\/\*\//g, toRegex) + '$').test(toKey)) { console.log(keys[i], ' --> ', toKey); to = true; toVal = jsonKeysTo[keys[i]]; break; } } if (to) { let tp = eval('root["' + path.join('"]["') + '"]'); // 取出节点对象 eval('delete root["' + path.join('"]["') + '"]'); // 删除节点 path.pop(); // 删除最后一个元素 path.push(toVal); // 追加元素 eval('root["' + path.join('"]["') + '"] = tp'); // 添加节点 } } console.log(JSON.parse(JSON.stringify(json))); jsonNodeRead(json); console.log(json);