JavaScript对象分配

时间:2018-03-29 16:24:18

标签: javascript

我尝试更新深层嵌套的对象而不覆盖现有属性,但无法找到一种优雅的方法来执行此操作,例如:

const data = {
  items: {
    one: {
      active: false,
      id: '123'
    },
    two: {
      active: true
    }
  }
}

const updatedData = {
  items: {
     one: {
        active: true
     }
  }
}

最终结果应为:

{
  items: {
    one: {
      active: true,
      id: '123'
    },
    two: {
      active: true
    }
  }
}

但是,使用Object.assign或点差运算符会将items.one替换为{active: true}而不会保留id。有没有办法在没有递归遍历对象的情况下做到这一点?

3 个答案:

答案 0 :(得分:0)

   function merge(source, into) {
     for(let key in into){
       if(typeof into[key] === "object") {
         merge(source[key] || (source[key] = {}), into[key]);
       } else {
         source[key] = into[key];
      }
   }
 }

答案 1 :(得分:0)

递归函数使它非常简单。迭代新数据的属性。如果属性的目标和源都引用了一个对象,则使用这两个对象递归调用该函数。否则只需将源值分配给目标值。



const data = {
  items: {
    one: {
      active: false,
      id: '123'
    },
    two: {
      active: true
    }
  }
}

const updatedData = {
  items: {
     one: {
        active: true
     }
  }
}

updateWith(data, updatedData);
console.log(data);

function updateWith(target, newData) {
  for (const [k, v] of Object.entries(newData)) {
    if (typeof v === "object" && typeof target[k] === "object") {
      updateWith(target[k], v);
    } else {
      target[k] = v;
    }
  }
}




答案 2 :(得分:0)

鉴于您引用了任意data.items[key]个对象,您可以执行以下操作:

data.items[key] = Object.assign({}, data.items[key], updatedData.items[key]);

以上内容将使用新对象值替换旧对象值,并从原始对象复制属性并最终替换更新数据提供的任何属性。