有几种不同的解决方案可以实现这一点:
1 - 原生 javascript for-in 循环:
const result = {};
let key;
for (key in obj1) {
if(obj1.hasOwnProperty(key)){
result[key] = obj1[key];
}
}
for (key in obj2) {
if(obj2.hasOwnProperty(key)){
result[key] = obj2[key];
}
}
2 -Object.keys()
:
const result = {};
Object.keys(obj1)
.forEach(key => result[key] = obj1[key]);
Object.keys(obj2)
.forEach(key => result[key] = obj2[key]);
3 -Object.assign()
:
(浏览器兼容性:Chrome: 45, Firefox (Gecko): 34, Internet Explorer: 不支持, Edge: (Yes), Opera: 32, Safari: 9)
const result = Object.assign({}, obj1, obj2);
4 -扩展运算符:
从ECMAScript 2015(第 6 版,ECMA-262)标准化:
在规范的几个部分中定义:Array Initializer,Argument Lists
使用这种新语法,您可以将不同的对象加入/合并为一个对象,如下所示:
const result = {
...obj1,
...obj2,
};
5 -jQuery.extend(target, obj1, obj2)
:
将两个或多个对象的内容合并到第一个对象中。
const target = {};
$.extend(target, obj1, obj2);
6 -jQuery.extend(true, target, obj1, obj2)
:
将两个或多个对象的内容深度合并到目标中。false
不支持传递第一个参数。
const target = {};
$.extend(true, target, obj1, obj2);
7 - Lodash_.assignIn(object, [sources])
:也称为_.extend
:
const result = {};
_.assignIn(result, obj1, obj2);
8 -洛达什_.merge(object, [sources])
:
const result = _.merge(obj1, obj2);
lodash 的合并函数和 之间有几个重要的区别Object.assign
:
1- 虽然它们都接收任意数量的对象,但 lodash 的合并应用了这些对象的深度合并,但Object.assign
只合并了第一级。例如:
_.isEqual(_.merge({
x: {
y: { key1: 'value1' },
},
}, {
x: {
y: { key2: 'value2' },
},
}), {
x: {
y: {
key1: 'value1',
key2: 'value2',
},
},
}); // true
但:
const result = Object.assign({
x: {
y: { key1: 'value1' },
},
}, {
x: {
y: { key2: 'value2' },
},
});
_.isEqual(result, {
x: {
y: {
key1: 'value1',
key2: 'value2',
},
},
}); // false
// AND
_.isEqual(result, {
x: {
y: {
key2: 'value2',
},
},
}); // true
2-另一个区别与如何Object.assign
和_.merge
解释undefined
value有关:
_.isEqual(_.merge({x: 1}, {x: undefined}), { x: 1 }) // false
但:
_.isEqual(Object.assign({x: 1}, {x: undefined}), { x: undefined })// true
更新 1:
for in
在 JavaScript 中使用循环时,我们应该特别注意我们的环境,特别是 JavaScript 类型中可能发生的原型变化。比如一些上了年纪的JavaScript库中添加新的东西Array.prototype
,甚至Object.prototype
。为了保护您的迭代免受添加的东西的影响,我们可以object.hasOwnProperty(key)
用来确保键实际上是您正在迭代的对象的一部分。
更新 2:
我更新了我的答案并添加了解决方案 4,这是一个新的 JavaScript 功能,但尚未完全标准化。我将它与Babeljs一起使用,Babeljs是用于编写下一代 JavaScript 的编译器。
更新 3:
我添加了Object.assign
和之间的区别_.merge
。