Javascript 将数组的项合并到单个对象中

Javascript 将数组的项合并到单个对象中,javascript,arrays,Javascript,Arrays,我有一个或多个对象数组,每个对象有两个属性,其中一个是数组。看起来是这样的: [ [{ name: 'Object1', items: ['item1', 'item2', 'item3'] }], [{ name: 'Object2', items: ['item4', 'item5', 'item6'] }], [{ name: 'Object3', items: ['item7', 'item8', 'item9'] }] ] 我要做的是

我有一个或多个对象数组,每个对象有两个属性,其中一个是数组。看起来是这样的:

[
 [{
   name: 'Object1',
   items: ['item1', 'item2', 'item3']
 }],
 [{
   name: 'Object2',
   items: ['item4', 'item5', 'item6']
 }],
 [{
   name: 'Object3',
   items: ['item7', 'item8', 'item9']
 }]

]
我要做的是使所有项目都存储到
对象1
。所以基本上,这就是我想要它的样子:

[
 {
   name: 'Object1',
   items: ['item1', 'item2', 'item3', 'item4', 'item5', 'item6', 'item7', 'item8', 'item9']
 }
]

我想我可以创建一个新对象并映射每个项目,然后将它们连接起来,但我正在寻找一种更有效的方法来实现这一点。完成此操作的最佳方法是什么?

您可以使用spread操作符来完成此操作

var sourceArray = [
 [{
   name: 'Object1',
   items: ['item1', 'item2', 'item3']
 }],
 [{
   name: 'Object2',
   items: ['item4', 'item5', 'item6']
 }],
 [{
   name: 'Object3',
   items: ['item7', 'item8', 'item9']
 }]
];

var targetArray = [];

sourceArray.forEach(item => {
    targetArray = [...targetArray, ...item[0].items];
})

…项[0]。如果内部对象不应包装在数组中,则应将项更改为项.items。

您可以使用排列运算符来执行此操作

var sourceArray = [
 [{
   name: 'Object1',
   items: ['item1', 'item2', 'item3']
 }],
 [{
   name: 'Object2',
   items: ['item4', 'item5', 'item6']
 }],
 [{
   name: 'Object3',
   items: ['item7', 'item8', 'item9']
 }]
];

var targetArray = [];

sourceArray.forEach(item => {
    targetArray = [...targetArray, ...item[0].items];
})
…项[0]。如果内部对象不应包装在数组中,则应将项更改为项.items。

您可以使用和获取单个数组中的所有项。然后将数组分配给
属性

注意:
Array.flatMap()
不受IE和Edge支持

const arr=[[{“name”:“Object1”,“items”:[“item1”,“item2”,“item3”]}],{“name”:“Object2”,“items”:[“item4”,“item5”,“item6”]}],{“name”:“Object3”,“items”:[“item7”,“item8”,“item9”]}];
常数结果=[{
名称:“Object1”,
项目:arr.flatMap(([o])=>o.items)
}];
控制台日志(结果)您可以使用和获取单个数组中的所有项。然后将数组分配给
属性

注意:
Array.flatMap()
不受IE和Edge支持

const arr=[[{“name”:“Object1”,“items”:[“item1”,“item2”,“item3”]}],{“name”:“Object2”,“items”:[“item4”,“item5”,“item6”]}],{“name”:“Object3”,“items”:[“item7”,“item8”,“item9”]}];
常数结果=[{
名称:“Object1”,
项目:arr.flatMap(([o])=>o.items)
}];
控制台日志(结果)对于es5,您可以结合使用,如下所示:

const newArray = oldArray.reduce((list, current) => list.concat(current[0].items), [])
实时示例代码:

const arr=[
[{
名称:“Object1”,
项目:['item1','item2','item3']
}],
[{
名称:'Object2',
项目:['item4','item5','item6']
}],
[{
名称:'Object3',
项目:['item7','item8','item9']
}]
]
常量y=arr.reduce((列表,当前)=>list.concat(当前[0]。项),[])
console.log(y)
与es5一起使用时,您可以结合使用,如下所示:

const newArray = oldArray.reduce((list, current) => list.concat(current[0].items), [])
实时示例代码:

const arr=[
[{
名称:“Object1”,
项目:['item1','item2','item3']
}],
[{
名称:'Object2',
项目:['item4','item5','item6']
}],
[{
名称:'Object3',
项目:['item7','item8','item9']
}]
]
常量y=arr.reduce((列表,当前)=>list.concat(当前[0]。项),[])
console.log(y)
像下面的代码一样使用map()函数

var x=[
 [{
   name: 'Object1',
   items: ['item1', 'item2', 'item3']
 }],
 [{
   name: 'Object2',
   items: ['item4', 'item5', 'item6']
 }],
 [{
   name: 'Object3',
   items: ['item7', 'item8', 'item9']
 }]
];
var name='';
var a=[];
x.map((element,i)=>{ //here pass element and index to first map
 element.map(el=>{
if(i==0){ // check if index is 0 so name here is required for new object 
 name=el.name;
 }
 el.items.map(item=>{
 a.push(item); // here add each items to the items array
 });
});
});
var obj={ // create new object with name and items array
name:name,
items:a
};
console.log(obj);
像下面的代码一样使用map()函数

var x=[
 [{
   name: 'Object1',
   items: ['item1', 'item2', 'item3']
 }],
 [{
   name: 'Object2',
   items: ['item4', 'item5', 'item6']
 }],
 [{
   name: 'Object3',
   items: ['item7', 'item8', 'item9']
 }]
];
var name='';
var a=[];
x.map((element,i)=>{ //here pass element and index to first map
 element.map(el=>{
if(i==0){ // check if index is 0 so name here is required for new object 
 name=el.name;
 }
 el.items.map(item=>{
 a.push(item); // here add each items to the items array
 });
});
});
var obj={ // create new object with name and items array
name:name,
items:a
};
console.log(obj);
隔离核心合并逻辑 从编写逻辑开始,只合并两个对象。这就是你明确说的:

“我们使用看到的第一个
名称
,并连接

const mergeObjects=(obj1,obj2)=>({
名称:obj1.name | | obj2.name,
项目:obj1.items.concat(obj2.items)
});
console.log(
合并对象(
{name:'Object1',items:['item1','item2','item3']},
{name:'Object2',items:['item4','item5','item6']}
)
);隔离核心合并逻辑
从编写逻辑开始,只合并两个对象。这就是你明确说的:

“我们使用看到的第一个
名称
,并连接

const mergeObjects=(obj1,obj2)=>({
名称:obj1.name | | obj2.name,
项目:obj1.items.concat(obj2.items)
});
console.log(
合并对象(
{name:'Object1',items:['item1','item2','item3']},
{name:'Object2',items:['item4','item5','item6']}
)

);所以你要丢弃重复的密钥?输出中保留值的条件是什么?映射并连接IMO。@PatrickRoberts在这种情况下没有重复的键。@theJuls重复的键是
name
。为什么内部对象被包装在数组中?所以你要丢弃重复的键?输出中保留值的标准是什么?映射并连接IMO。@PatrickRoberts在这种情况下没有重复的键。@theJuls重复的键是
name
。为什么内部对象被包装在数组中?注意:
flatMap()
标记为实验注意:
flatMap()
标记为实验