普通 JS 或 Lodash - 用其他对象的值替换对象值

nor*_*orr 5 javascript ecmascript-6 lodash

我有两个对象:

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

let second = {
   b: 55,
   d: 'demo'
}
Run Code Online (Sandbox Code Playgroud)

我只想将第二个对象中已有的项目替换为第一个对象。结果应如下所示(因此仅应更改 b 项,并忽略新的 d 项):

{
   a: 'John',
   b: 55, // changed
   c: 'example'
}
Run Code Online (Sandbox Code Playgroud)

合并将不起作用,因为它还会添加新项目。我可以使用 foreach 但我相信对此应该有一个简短的答案。我已经在我的项目中使用了 lodash,所以我可以使用那里的函数,但我找不到任何用于此目的的函数。有没有?

Akr*_*ion 4

_.merge使用 lodash,您可以使用,_.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)
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,您可以在新对象上使用Object.keys,然后使用Array.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)
Run Code Online (Sandbox Code Playgroud)

这假设您不想要mutate任何对象。如果你不关心:

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)
Run Code Online (Sandbox Code Playgroud)