我希望能够合并两个具有相同属性/键的JavaScript对象。只是这些值不是重复的。 例如,我想:
var obj1 = {
0:{id: 33, name: 'abc', date: "12/12/12", type:"11" },
1: {id: 33, name: 'abc3', date: "12/13/12", type:"131"}
}
var obj2 = {
0:{id: 22, name: 'abc1', date: "12/1/13", type: "33" }
1:{id: 4, name: 'abc4', date: "12/4/12", type:"14"}
}
这是小提琴:http://jsfiddle.net/q9c8k2yh/ 这是预期的结构:
var obj3 = {
0: { id: 33, name: 'abc', date: "12/12/12", type:"11" },
1: { id: 22, name: 'abc1', date: "12/1/13", type: "33" }
}
我在网上查找了来源,并得到了最常见的答案:
Object.assign(obj2, obj1);
我尝试过:
obj3 = Object.assign(obj2, obj1);//returns { id: 33, name: 'abc', date: "12/12/12", type:"11" }
obj3 = Object.assign(obj1, obj2);//return { id: 22, name: 'abc1', date: "12/1/13", type: "33" }
obj3 = Object.assign({},obj2, obj1); //return { id: 33, name: 'abc', date: "12/12/12", type:"11" }
但是它们都不给我两个对象。我不想替换一个。有办法实现吗?
谢谢!
答案 0 :(得分:3)
您所描述的看起来更像是数组而不是对象。但是,如果您想要一个带有数字键的对象,那么可以做到这一点:
var obj1 = { id: 33, name: 'abc', date: "12/12/12", type:"11" }
var obj2 = { id: 22, name: 'abc1', date: "12/1/13", type: "33" }
let arr = [obj1, obj2]
// turn array into object:
let obj_all = {...arr}
console.log(obj_all)
新对象将保留对旧对象的引用。目前尚不清楚这是您要追求的,还是想要克隆。
要制作克隆,您当然可以散布对象:
var obj1 = { id: 33, name: 'abc', date: "12/12/12", type:"11" }
var obj2 = { id: 22, name: 'abc1', date: "12/1/13", type: "33" }
let arr = [{...obj1}, {...obj2}]
let obj_all = {...arr}
// changes in original objects have no effect on clones
obj1.id="New Value"
console.log(obj_all)
答案 1 :(得分:0)
听起来像是您在寻找哈希图,而不是合并2个对象:
var obj3 = {
0: obj1,
1: obj2
}
Object.assign在上一个参数的顶部合并,第一个参数是要替换的对象,因此:
Object.assign(obj2, obj1);
将obj2
替换为自身,并将obj1
浅合并。
答案 2 :(得分:0)
您可以使用对象剩余传播(ES 2018)轻松克隆它们:
var obj1 = { id: 33, name: 'abc', date: "12/12/12", type:"11" }
var obj2 = { id: 22, name: 'abc1', date: "12/1/13", type: "33" }
var obj3 = {
0: { ...obj1 },
1: { ...obj2 }
}
console.log(obj3);
现在,如果您更改obj1
,它将不会更改obj3["0"]
。
答案 3 :(得分:0)
好像您想创建一个以整数值作为键并以值作为请求对象的新对象
var arrayOfObjects = [obj1, obj2]; //put here object you want to 'merge'
var result = Object.assign({}, arrayOfObjects);
或者如果您需要一个功能。它看起来像:
function merge(arrayOfObjects){
return object.assign({}, arrayOfObjects);
}
答案 4 :(得分:0)
另一种方法可能是这样。对项目进行字符串化并对其进行解析,以进行深度克隆。
var obj1 = { id: 33, name: 'abc', date: "12/12/12", type:"11" }
var obj2 = { id: 22, name: 'abc1', date: "12/1/13", type: {
id: 3
} }
const mergeWithReference = (...args) => {
return args.reduce((acc,item,index) => {
acc[index] = JSON.parse(JSON.stringify(item))
return acc
}, {})
}
const mergedObj = mergeWithReference(obj1, obj2)
obj1.id = 85
obj2.type.id = 22
console.log(mergedObj);