更改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);

 

posted @ 2023-01-06 14:25  散人长情  阅读(388)  评论(0编辑  收藏  举报