将嵌套的JavaScript对象数据项替换为动态创建的路径?

时间:2018-12-13 13:19:49

标签: javascript json

我有这个JSON数据对象(示例):

let obj = [
  {
    test0: [ 
      {testA: 'ContentA' },
      {testB: 'ContenB'}
    ] 
  }
];

我想动态替换键“ testB”的值。即我需要能够处理对象中的任何项目并替换ist。

到目前为止,这是我正在做的事情:

因此,我以编程方式生成了一个混合的键/索引路径来寻址目标对象,它看起来像这样(以数组形式):

let path = [0,'\'test0\'',1,'\'testB\''];

为了将其放入可执行形式中进行实际替换,我将路径转换为JavaScript代码并使用eval运行它。像这样:

let newText = 'ContentB';
eval(`obj[${path.join('][')}]=\'${newText}\'`);

Eval执行以下代码文字:

obj[0]['test0'][1]['testB'] = 'ContentB'

这行得通,但是如果可能的话,我想知道是否还有一种不使用“ eval”的替代方法。

1 个答案:

答案 0 :(得分:2)

您可以使用递归函数,并将属性路径作为属性数组传递给它,如下所示:

function setDeepValue(obj, [prop, ...path], value) {
    if (!path.length) {
        obj[prop] = value; 
    } else {
        if (!(prop in obj)) obj[prop] = {};
        setDeepValue(obj[prop], path, value);
    }
}

// Example:
const arr = [{
    test0: [ 
        { testA: 'ContentA' },
        { testB: 'ContenB' }
    ]
}];
  
setDeepValue(arr, [0, "test0", 1, "testB"], "ContentB");

console.log(arr);

如果您可以使用库,则可以使用Lodash,它具有_.set和更灵活的_.setWith