JS递归替换属性

JS递归替换属性

替换前

let 李华 = {
    姓名: "李华",
    关系: "本人",
    年龄: 20,
    孩子:[
        {
            姓名: "李华儿子",
            关系: "儿子",
            年龄: 10,
            孩子:[
                    {
                        姓名: "李华儿子的儿子",
                        关系: "孙子",
                        年龄: 5,
                        孩子:[]
                    },
            ]
        },
        {
            姓名: "李华女儿",
            关系: "女儿",
            年龄: 10,
            孩子:[
                {
                    姓名: "李华女儿的女儿",
                    关系: "孙女",
                    年龄: 5,
                    孩子:[]
                },
            ]
        }
    ]
}

替换后

{
    "name": "李华",
    "children": [
        {
            "name": "李华儿子",
            "children": [
                {
                    "name": "李华儿子的儿子",
                    "children": []
                }
            ]
        },
        {
            "name": "李华女儿",
            "children": [
                {
                    "name": "李华女儿的女儿",
                    "children": []
                }
            ]
        }
    ]
}

实现

/**
 * 
 * @param { Object } obj 原始递归对象
 * @param { Array } arr 映射策略数组 {oldVal: 'oldKey', newVal: 'newKey'}
 * @param { Boolean } isDeal 是否处理其他不在策略中的属性,
 *                  默认不处理,true按原对象属性处理
 * @returns { Object } 处理后的对象 
 */
function replaceTreeAttr(obj, arr, isDeal) {
     let newObj = {};
     let oldValArr = arr.map(item => item.oldVal);
     for (const key in obj) {
         if (isDeal && !oldValArr.includes(key)) {
             newObj[key] = obj[key]
         }
     }
     for (let i = 0; i < arr.length; i++) {
         if (typeof arr[i].oldVal !== "string") {
             throw new Error("oldVal必须是字符串");
         }
         if (typeof arr[i].newVal !== "string") {
             throw new Error("newVal必须是字符串");
         }
         if (Array.isArray(obj[arr[i].oldVal])) {
             newObj[arr[i].newVal] = JSON.parse(JSON.stringify(obj[arr[i].oldVal]));
             for (let j = 0; j < obj[arr[i].oldVal].length; j++) {
                 newObj[arr[i].newVal][j] = replaceTreeAttr(obj[arr[i].oldVal][j], arr, isDeal);
             }
         }else {
             newObj[arr[i].newVal] = obj[arr[i].oldVal]
         }
     }
     return newObj;
 }

console.log(replaceTreeAttr(李华, [{oldVal: "姓名", newVal: "name"}, {oldVal: "孩子", newVal: "children"}], false));
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值