Object.assign对象合并

68 阅读1分钟

【基本功能】 Object.assign(target, source) 可以将多个源对象的可枚举自有属性复制到目标对象,返回修改后的目标对象。‌‌

Object.assign(target, source1, source2);

将 source1source2 的属性复制到 target,返回 target,若多个源对象有相同属性,后者的值会覆盖前者。

【使用过程中遇到过的问题】

source里面的属性有而target中没有的属性,会直接复制给target,这个时候没什么问题。

但是,source里面没有的属性有而target中有的属性,会跳过而直接使用target原来的值。 若不做处理会导致更新后的值其实某些字段并没有更新,还是会保留原来的值。

(数据是从后端来的,是存在某个字段的值为null,后端就不传这个字段的情况的)

所以这个时候要先清除原来的值

function assignAndDeleteMissing(target, ...sources) {
  // 获取目标对象的所有键
  const targetKeys = Object.keys(target);
  console.log(targetKeys)
  // 删除目标对象中不在源对象中的属性
  targetKeys.forEach(key => {
    let exists = false;
    sources.forEach(source => {
      if (source.hasOwnProperty(key)) {
        exists = true;
      }
    });
    if (!exists) {
      delete target[key];
      console.log('delete', key)
    }
  });
  // 执行 Object.assign
  return Object.assign(target, ...sources);
}

为了不在更新数据的时候产生多余的变化,如果是已存在的属性,则不做修改,只将source中不存在的属性先行删除,然后再执行 Object.assign 操作

【附】官网链接