我有两个对象数组。如何将它们组合/合并为一个对象数组。
我尝试使用concat函数以及遍历arr2并将其推入arr1中,但是我想用一种更短的方式来做。
let arr1 = [{
_id: 1,
external_id: '74341f74-9c79-49d5-9611-87ef9b6eb75f',
name: 'Francisca Rasmussen',
alias: 'Miss Coffey'
},
{ _id: 19,
external_id: '68e35e26-7b1f-46ec-a9e5-3edcbcf2aeb9',
name: 'Francis Rodrigüez',
alias: 'Mr Lea'
},
{ _id: 23,
external_id: 'e9db9277-af4a-4ca6-99e0-291c8a97623e',
name: 'Francis Bailey',
alias: 'Miss Singleton'
}];
let arr2 = [ { organizations: 'Multron', joining_key: 1 },
{ organizations: 'Bitrex', joining_key: 19 },
{ organizations: 'Enthaze', joining_key: 23 },
{ tickets: 'A Nuisance in Kiribati', joining_key: 1 },
{ tickets: 'A Nuisance in Saint Lucia', joining_key: 19 }
{ tickets: 'A Nuisance in Saint Kilda', joining_key: 19 }
]
我想连接它们,根据arr1上的_id字段的join_key提供以下结果:
[{
_id: 1,
external_id: '74341f74-9c79-49d5-9611-87ef9b6eb75f',
name: 'Francisca Rasmussen',
alias: 'Miss Coffey',
organizations: 'Multron',
tickets: 'A Nuisance in Kiribati', joining_key: 1
},
{ _id: 19,
external_id: '68e35e26-7b1f-46ec-a9e5-3edcbcf2aeb9',
name: 'Francis Rodrigüez',
alias: 'Mr Lea',
organizations: 'Bitrex',
tickets: 'A Nuisance in Saint Lucia',
tickets: 'A Nuisance in Saint Kilda'
},
{ _id: 23,
external_id: 'e9db9277-af4a-4ca6-99e0-291c8a97623e',
name: 'Francis Bailey',
alias: 'Miss Singleton',
organizations: 'Enthaze'
}]
答案 0 :(得分:1)
在这种情况下,您可以使用Object.assign(...arr1)
更多关于传播算子的参考,位于https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_syntax
let arr1 = [{ _id: 1,
external_id: '74341f74-9c79-49d5-9611-87ef9b6eb75f',
name: 'Francisca Rasmussen',
alias: 'Miss Coffey',
created_at: '2016-04-15T05:19:46 -10:00'
}];
let arr2 = [ { organizations: 'Multron' },
{ tickets_1: 'A Nuisance in Kiribati' },
{ tickets_2: 'A Nuisance in Saint Lucia' }
];
arr1 = arr1.concat(arr2)
//console.log(arr1)
let result = [Object.assign(...arr1)]
console.log(result)
答案 1 :(得分:1)
通过编辑,这是一个完全不同的问题。您的数组具有_id
属性,您想使用这些属性来查找项目。 arr1
应该是一个对象,这样就可以查找具有给定id的特定项目而无需搜索整个列表。实际上,最好创建一个可用于合并对象的查找对象(尽管您可以在数组上使用find()
。
然后仅浏览arr2
并将对象添加到arr1
中的正确项目中:
let arr1 = [{_id: 1,external_id: '74341f74-9c79-49d5-9611-87ef9b6eb75f',name: 'Francisca Rasmussen',alias: 'Miss Coffey'},{ _id: 19,external_id: '68e35e26-7b1f-46ec-a9e5-3edcbcf2aeb9',name: 'Francis Rodrigüez',alias: 'Mr Lea'},{ _id: 23,external_id: 'e9db9277-af4a-4ca6-99e0-291c8a97623e',name: 'Francis Bailey',alias: 'Miss Singleton'}];
let arr2 = [ { organizations: 'Multron', joining_key: 1 },{ organizations: 'Bitrex', joining_key: 19 },{ organizations: 'Enthaze', joining_key: 23 },{ tickets: 'A Nuisance in Kiribati', joining_key: 1 },{ tickets: 'A Nuisance in Saint Lucia', joining_key: 19 },{ tickets: 'A Nuisance in Saint Kilda', joining_key: 19 }]
// make lookup
let lookup = arr1.reduce((obj, item) => (obj[item._id] = item, obj), {})
// merge objects using lookup
arr2.forEach(item => {
let {joining_key, ...rest} = item // seperate join_key-it's not in the final result
Object.assign(lookup[joining_key], rest)
})
// arr1 now has merged objects
console.log(console.log(arr1))
注意:您想要的结果为具有_id: 19
的对象提供了两个tickets
属性。属性在对象上必须是唯一的,所以这是不可能的。
答案 2 :(得分:0)
使用点差运算符
const arr3 = [{ ...arr1[0], ...arr2[0] }]
很简单,不是吗?
在您的情况下,这将返回一个具有单个对象的数组(两个对象现已合并)
答案 3 :(得分:0)
将数组推入另一个数组Docs
//array1 with some content
let array1=["item1","item2"];
//array2 with some content
let array2=["item3","item4"];
//create empty array
let array3=[];
//concatenate arrays
//add array1
array3.push(array1);
//add array2
array3.push(array2);
//display result
console.log(array3);
答案 4 :(得分:0)
我认为这会给您答案,我不知道它是否是最佳解决方案,但对我有用。
arr1.forEach(element => {
var filtered = arr2.filter(obj => obj.joining_key === element._id);
filtered.forEach(filtered_object => {
let i = 0;
Object.keys(filtered_object).forEach(key => {
if (i == 0) {
element[key] = filtered_object[key]
}
i = i + 1;
})
})
})