我有两个 json 对象obj1和obj2,我想合并它们并创建一个json对象。生成的json应该具有来自obj2的所有值和来自obj1的值,而obj2中不存在这些值。
Question:
var obj1 = {
"name":"manu",
"age":23,
"occupation":"SE"
}
var obj2 = {
"name":"manu",
"age":23,
"country":"india"
}
Expected:
var result = {
"name":"manu",
"age":23,
"occupation":"SE",
"country":"india"
}
发布于 2014-01-30 15:19:25
有几种不同的解决方案可以实现这一点:
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 -
const result = {};
Object.keys(obj1)
.forEach(key => result[key] = obj1[key]);
Object.keys(obj2)
.forEach(key => result[key] = obj2[key]);
3 -
(浏览器兼容性: Chrome: 45,Firefox (Gecko):34,Internet Explorer:不支持,Edge:(是),Opera: 32,Safari: 9)
const result = Object.assign({}, obj1, obj2);
4 -
从ECMAScript 2015 (6th Edition, ECMA-262)标准化
在规范的几个部分中定义的
使用这种新语法,您可以将不同的对象连接/合并为一个对象,如下所示:
const result = {
...obj1,
...obj2,
};
5 -
将两个或多个对象的内容合并到第一个对象中。
const target = {};
$.extend(target, obj1, obj2);
6 -
将两个或多个对象的内容深度合并到目标中。不支持为第一个参数传递false
。
const target = {};
$.extend(true, target, obj1, obj2);
const result = {};
_.assignIn(result, obj1, obj2);
const result = _.merge(obj1, obj2);
Object.assign
**:**的合并功能和之间有几个重要的区别
1-虽然它们都可以接收任意数量的对象,但是lodash的merge会对这些对象进行深度合并,但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
之间的区别。
发布于 2014-01-30 15:42:42
使用Jquery最简单的方法:
var finalObj = $.extend(obj1, obj2);
如果没有Jquery -
var finalobj={};
for(var _obj in obj1) finalobj[_obj ]=obj1[_obj];
for(var _obj in obj2) finalobj[_obj ]=obj2[_obj];
发布于 2016-05-16 17:29:58
1)
var merged = {};
for(key in obj1)
merged[key] = obj1[key];
for(key in obj2)
merged[key] = obj2[key];
2)
var merged = {};
Object.keys(obj1).forEach(k => merged[k] = obj1[k]);
Object.keys(obj2).forEach(k => merged[k] = obj2[k]);
或
Object.keys(obj1)
.concat(Object.keys(obj2))
.forEach(k => merged[k] = k in obj2 ? obj2[k] : obj1[k]);
3)最简单的方式:
var merged = {};
Object.assign(merged, obj1, obj2);
https://stackoverflow.com/questions/21450060
复制相似问题