如何合并两个对象,覆盖空值?

Hub*_*iak 3 javascript merge lodash

我想合并两个相似但不相同的对象并覆盖其中一个中的空值(如果存在)。例如,我有这两个对象:

const obj1 = {
    a: 1,
    b: '',
    c: [],
    d: null
}

const obj2 = {
    a: 2,
    b: null,
    d: 1
}
Run Code Online (Sandbox Code Playgroud)

合并的效果应该是:

const objMerged = {
    a: 2,
    b: '',
    c: [],
    d: 1
}
Run Code Online (Sandbox Code Playgroud)

换句话说,合并对象中最重要的数据源是obj2但它缺少一些属性 from obj1,因此需要复制它们,并且一些obj2值也null应该从中获取obj1

编辑我试过:

_.extend({}, obj1, obj2) 
Run Code Online (Sandbox Code Playgroud)

Object.assign({}, obj1, obj2)
Run Code Online (Sandbox Code Playgroud)

Akr*_*ion 8

您还可以混合搭配ES6 解构和 lodash _.omitBy

const obj1 = { a: 1, b: '', c: [], d: null }
const obj2 = { a: 2, b: null, d: 1 }

const result = {..._.omitBy(obj1, _.isNull), ..._.omitBy(obj2, _.isNull)}

console.log(result)
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>
Run Code Online (Sandbox Code Playgroud)

你也可以像这样用 ES6 做到这一点:

const obj1 = { a: 1, b: '', c: [], d: null }
const obj2 = { a: 2, b: null, d: 1 }

let omitNull = obj => {
  Object.keys(obj).filter(k => obj[k] === null).forEach(k => delete(obj[k]))
  return obj
}

const result = { ...omitNull(obj1), ...omitNull(obj2) }

console.log(result)
Run Code Online (Sandbox Code Playgroud)


Ori*_*ori 5

您可以使用_.mergeWith(), ,并且在合并回调中仅采用第二个值(如果不是)null

const obj1 = { a: 1, b: '', c: [], d: null }
const obj2 = { a: 2, b: null, d: 1 }

const result = _.mergeWith({}, obj1, obj2, (o, s) => _.isNull(s) ? o : s)

console.log(result)
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.11/lodash.min.js"></script>
Run Code Online (Sandbox Code Playgroud)


And*_*ney 5

为了添加到这个好的答案列表中,这里有一个适用于嵌套结构的递归解决方案。

此示例将把对象的公共属性合并dstsrc所有嵌套级别的对象中,保留任何不常见的属性。

const merge = (dst, src) => {
  Object.keys(src).forEach((key) => {
    if (!dst[key]) {
      dst[key] = src[key];
    } else if (typeof src[key] === 'object' && src[key] !== null && typeof dst[key] === 'object' && dst[key] !== null) {
      merge(dst[key], src[key]);
    }
  });
},

/* Usage: */

src = {
  prop1: '1',
  prop2: {
    val: 2,
  }
},
dst = {
  prop1: null,
  prop2: {
    val: null,
  },
  prop3: null,
};

merge(dst, src);
console.log(dst);
Run Code Online (Sandbox Code Playgroud)

  • 很好的答案。我真的很喜欢这个解决方案! (2认同)