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()
标记为实验