有几种不同的解决方案可以实现这一点:
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:(是),Opera : 32, Safari: 9)
const result = Object.assign({}, obj1, obj2);
4 - Spread Operator:
标准化自ECMAScript 2015 (6th Edition, 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 - Lodash _.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 值有关:
_.isEqual(_.merge({x: 1}, {x: undefined}), { x: 1 }) // false
但是:
_.isEqual(Object.assign({x: 1}, {x: undefined}), { x: undefined })// true
更新 1:
在 JavaScript 中使用 for in 循环时,我们应该特别注意我们的环境,特别是 JavaScript 类型中可能发生的原型更改。例如,一些较旧的 JavaScript 库向 Array.prototype 甚至 Object.prototype 添加了新内容。
为了保护您的迭代免受添加的东西的影响,我们可以使用object.hasOwnProperty(key) 来确保密钥实际上是您正在迭代的对象的一部分。
更新 2:
我更新了我的答案并添加了解决方案 4,这是一个新的 JavaScript 功能,但尚未完全标准化。我将它与Babeljs 一起使用,这是一个用于编写下一代 JavaScript 的编译器。
更新 3:
我添加了Object.assign 和_.merge 之间的区别。