代码之家  ›  专栏  ›  技术社区  ›  c-chavez

内部部分属性的javascript条件更新,而不删除其他属性

  •  1
  • c-chavez  · 技术社区  · 7 年前

    this question 但我现在面临着一个不同的问题。

    let oldObj = { 
        test1: 'valueTest1',
        test2: {
            inner1: 'valueInner1',
            inner2: 'valueInner2',
            inner3: {
                otherInner1: 'valueOtherInner1',          
                otherInner2: 'valueOtherInner2'
                }
            },
        test3: 'valueTest3' 
    };
    
    let newObj = {
        test2: {
            inner1: 'newValueInner1',
            }
    }
    

    使用这个代码:

    for (const key of Object.keys(newObj)) {
      if (key in oldObj) {
        oldObj[key] = newObj[key];
      }
    }
    

    {
        test1:'valueTest1',
        test2: {
            inner1: 'newValueInner1'
            },
        test3:'valueTest3'
    }
    

    但我不想删除内部对象的其他属性(inner2、inner3等)。我希望这样的结果:

    { 
        test1: 'valueTest1',
        test2: {
            inner1: 'newValueInner1',
            inner2: 'valueInner2',
            inner3: {
                otherInner1: 'valueOtherInner1',          
                otherInner2: 'valueOtherInner2'
                }
            },
        test3: 'valueTest3' 
    }
    

    有没有一种方法可以让一个函数做到这一点?

    这里的对象只是示例,我想实现的是创建一个函数,它可以在不删除其余对象的情况下深度修改对象属性。

    例如,如果我将newObj定义为:

    let newObj = {
        test2: {
            inner3: {
                otherInner1:'newValueInner1'
                }
            }
    }
    

    { 
        test1: 'valueTest1',
        test2: {
            inner1: 'valueInner1',
            inner2: 'valueInner2',
            inner3: {
                otherInner1: 'newValueInner1',          
                otherInner2: 'valueOtherInner2'
                }
            },
        test3: 'valueTest3' 
    };
    
    3 回复  |  直到 7 年前
        1
  •  1
  •   Fabian N.    7 年前

    您需要迭代objects条目,如果找到另一个对象,则使用嵌套对象进行更新。

    function update(target, source) {
        Object.entries(source).forEach(([key, value]) => {
            if (value && typeof value === 'object') {
                update(target[key] = target[key] || {}, value);
                return;
            }
            target[key] = value;
        });
    }
    
    var oldObj = { test1: 'valueTest1', test2: { inner1: 'valueInner1', inner2: 'valueInner2', inner3: { otherInner1: 'valueOtherInner1', otherInner2: 'valueOtherInner2' } }, test3: 'valueTest3' },
        newObj = { test2: { inner1: '!!!!!!!!!!!!' } };
    
    update(oldObj, newObj);
    console.log(oldObj);
        2
  •  1
  •   chazsolo    7 年前

    newObj 到上面 oldObj

    let oldObj = { 
        test1: 'valueTest1',
        test2: {
            inner1: 'valueInner1',
            inner2: 'valueInner2',
            inner3: {
                otherInner1: 'valueOtherInner1',          
                otherInner2: 'valueOtherInner2'
                }
            },
        test3: 'valueTest3' 
    };
    
    let newObj = {
        test2: {
            inner1: 'newValueInner1',
        }
    }
    
    for (const key of Object.keys(newObj)) {
      if (key in oldObj) {
        oldObj[key] = {
          ...oldObj[key], // set oldObj[key] to itself
          ...newObj[key]  // override properties from newObj[key]
        }
      }
    }
    
    console.log(oldObj)

    编辑:正如@riv所指出的,您还可以使用 Object.assign :

    oldObj[key] = Object.assign(oldObj[key], newObj[key]);
    
        3
  •  0
  •   943A    7 年前

    for (var item in newObj)
    {
      // is item an value item?
      if(typeof newObj[item] == "string")
      {
         oldObj[item] = newObj[item];
      }
      // Is the value an object with inner items?
      else if(typeof newObj[item] == "object")
      {
        for(var innerItem in newObj[item])
        {
          if(typeof newObj[item][innerItem] == "string")
          {
             oldObj[item][innerItem] = newObj[item][innerItem];
          }
        }
      }
    }