如何将2个具有相同属性的对象组合在一起

时间:2018-10-17 20:35:39

标签: javascript

我希望能够合并两个具有相同属性/键的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/ 这是预期的结构:

enter image description here 我希望o / p为:

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" }

但是它们都不给我两个对象。我不想替换一个。有办法实现吗?

谢谢!

5 个答案:

答案 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);