代码之家  ›  专栏  ›  技术社区  ›  LongHike

是否用动态创建的路径替换嵌套的JavaScript对象数据项?

  •  0
  • LongHike  · 技术社区  · 6 年前

    我得到了这个JSON数据对象(示例):

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

    以下是我目前正在做的事情:

    因此,我以编程方式生成一个混合键/索引路径来寻址目标对象,它如下所示(以数组形式):

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

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

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

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

    1 回复  |  直到 6 年前
        1
  •  2
  •   trincot    6 年前

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

    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 这样做。