如何使用lodash更改深层嵌套对象中的对象键?

问题描述:

我有以下类型的对象:如何使用lodash更改深层嵌套对象中的对象键?

{ 
    options: [ 
    { id: 1, value: 'a' } 
    ], 
    nestedObj: { 
    options: [ 
     { id: 2, value: 'b' } 
    ] 
    } 
} 

如何更改键“id”两个,选择数组中的第一级和嵌套的水平?我曾尝试使用lodash这个而不是一直能得到期望的结果:

{ 
    options: [ 
    { newKey: 1, value: 'a' 
    ], 
    nestedObj: { 
    options: [ 
     { newKey: 2, value: 'b' } 
    ] 
    } 
} 

所以我想找到它的工作原理是lodash mapKeys但将通过深嵌套的对象迭代函数。

+0

它可以出现在任何深度? – alex

+0

@alex是的,具有这些键值对的对象的选项数组可以并将出现在任何深度。 –

您可以使用_.transform()递归替换键:

var obj = { 
 
    options: [{ 
 
    id: 1, 
 
    value: 'a' 
 
    }], 
 
    nestedObj: { 
 
    options: [{ 
 
     id: 2, 
 
     value: 'b' 
 
    }] 
 
    } 
 
}; 
 

 
console.log(replaceKeysDeep(obj, { 
 
    id: 'newKey', 
 
    options: 'items' 
 
})); 
 

 
function replaceKeysDeep(obj, keysMap) { // keysMap = { oldKey1: newKey1, oldKey2: newKey2, etc... 
 
    return _.transform(obj, function(result, value, key) { // transform to a new object 
 

 
    var currentKey = keysMap[key] || key; // if the key is in keysMap use the replacement, if not use the original key 
 

 
    result[currentKey] = _.isObject(value) ? replaceKeysDeep(value, keysMap) : value; // if the key is an object run it through the inner function - replaceKeys 
 
    }); 
 
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.15.0/lodash.js"></script>