纯JS或Lodash - 用另一个对象的值替换对象值

5

我有两个对象:

let first = {
   a: 'John',
   b: 22,
   c: 'example'
}

let second = {
   b: 55,
   d: 'demo'
}

我想只替换第二个对象中已存在的项目到第一个对象中。结果应该像这样(因此只有 b 项目将被更改,新的 d 项目会被忽略):
{
   a: 'John',
   b: 55, // changed
   c: 'example'
}

合并操作无法正常工作,因为它还会增加新项目。 我可以使用 foreach,但我相信应该有更简洁的答案。我已经在我的项目中使用了lodash,所以我可以使用其中的函数,但是我找不到任何与此目的相符的函数。是否有任何相关的函数?
6个回答

4
使用lodash,您可以使用_.merge_.pick_.keys来实现以下操作:

let first = {
   a: 'John',
   b: 22,
   c: 'example'
}, second = {
   b: 55,
   d: 'demo'
}

let result = _.merge(first, _.pick(second, _.keys(first)))

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

使用ES6,你可以像这样在新对象上使用Object.keysArray.forEach:

let first = {
   a: 'John',
   b: 22,
   c: 'example'
}, second = {
   b: 55,
   d: 'demo'
}, result = new Object(null)

Object.keys(first).forEach(k => result[k] = second[k] || first[k])

console.log(result)

假设您不想对任何对象进行变异。如果您不关心:

let first = {
   a: 'John',
   b: 22,
   c: 'example'
}, second = {
   b: 55,
   d: 'demo'
}

Object.keys(first).forEach(k => first[k] = second[k] || first[k])

console.log(first)


3

如果您使用ES6,您可以使用这个

let merge = { ...first, ..._.pick(second, Object.keys(first)) }

2
你可以使用循环遍历第二个数组中的键。对于任何在第一个数组中存在的键,都覆盖其值。

let first = {
   a: 'John',
   b: 22,
   c: 'example'
}

let second = {
   b: 55,
   d: 'demo'
}

for (const k in second) {
  if (k in first) {
    first[k] = second[k];
  }
}

console.log(first);


0

您想要更新属性的

交集

的值。

因此,基本上是这样的:

Object.keys(a).forEach(prop => if(b.hasOwnProperty(prop)) a[prop] = b[prop]))

或者

_.intersection(Object.keys(a), Object.keys(b)).forEach(prop => a[prop] = b[prop])

0

使用 Lodash 的两个函数 MergeWithPick

var a = {
   a: 'John',
   b: 22,
   f:[11,22,2],
   d: {a:1,b:2,c:0},
   c: 'example'
}

var b = {
   b: 55,
   f:[3],
   d: {c:1,b:11},
}

function mergeObjects(a,b){
  let common = _.pick(b, Object.keys(a));
  return _.mergeWith(a, common, customizer)
}

function customizer(objValue, srcValue) {
  if (_.isArray(objValue)) {
    return objValue.concat(srcValue);
  }
  if(_.isObject(objValue)) {
      return mergeObjects(objValue,srcValue)
  }
}
mergeObjects(a,b)


0

let first = {
   a: 'John',
   b: 22,
   c: 'example'
}

let second = {
   b: 55,
   d: 'demo'
}

Object.keys(second).forEach(function(key,index){
  if (first.hasOwnProperty(key)) {
        first[key]=second[key];
  }
});

console.log(first);


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接