Javascript 将多维对象数组简化为单个对象数组
我有这个多维的物体阵列-Javascript 将多维对象数组简化为单个对象数组,javascript,arrays,object,reduce,transpose,Javascript,Arrays,Object,Reduce,Transpose,我有这个多维的物体阵列- const initialArray = [ { name: 'aaa', value:[{id:1, data:1}, {id:2, data:2}, {id:3, data:3}] }, { name: 'bbb', value:[{id:1, data:4}, {id:2, data:5}, {id:3, data:6}] }, { name: 'ccc', value:[{id:1, data:7},
const initialArray = [
{
name: 'aaa',
value:[{id:1, data:1}, {id:2, data:2}, {id:3, data:3}]
},
{
name: 'bbb',
value:[{id:1, data:4}, {id:2, data:5}, {id:3, data:6}]
},
{
name: 'ccc',
value:[{id:1, data:7}, {id:2, data:8}, {id:3, data:7}]
},
{
name: 'ddd',
value:[{id:1, data:2}, {id:2, data:1}, {id:3, data:1}]
}
]
我需要把它转换成这个数组-
const finalArray = [
{
id: 1, aaa: 1, bbb: 4, ccc: 7, ddd: 2
},
{
id: 2, aaa: 2, bbb: 5, ccc: 8, ddd: 1
},
{
id: 3, aaa: 3, bbb: 6, ccc: 7, ddd: 1
}
]
我现在的解决办法是
initialArray.reduce((accum, arrayData) => {
arrayData.value.forEach(element => {
if (accum.some(el => el.id === element.id)) {
accum.find(el => el.id === element.id)[arrayData.name] = element.data;
} else {
accum.push({ id: element.id, [arrayData.name]: element.data });
}
});
return accum;
}, []);
有没有更好更优雅的方法?我正试图通过减少遍历每个数组的次数来实现这一点,并且代码更少,可读性更强。如您所见,每次迭代中的some和find都会增加迭代次数。有什么办法可以减少吗?
函数转换(数组){
常量obj={}
forEach({name,value})=>(value | |[]).forEach({id,data})=>obj[id]={id,…obj[id],[name]:data}))
返回对象值(obj)
}
常量初始数组=[
{
名称:“aaa”,
值:[{id:1,数据:1},{id:2,数据:2},{id:3,数据:3}]
},
{
名称:“bbb”,
值:[{id:1,数据:4},{id:2,数据:5},{id:3,数据:6}]
},
{
名称:“ccc”,
值:[{id:1,数据:7},{id:2,数据:8},{id:3,数据:7}]
},
{
名称:“ddd”,
值:[{id:1,数据:2},{id:2,数据:1},{id:3,数据:1}]
}
]
log(tranform(initialArray))
您可以使用
var initialArray=[{name:'aaa',value:[{id:1,data:1},{id:2,data:2},{id:3,data:3}]},{name:'bbb',value:[{id:1,data:4},{id:2,data:5},{id:3,data:6}]},{name:'ccc',value:[{id:1,data:7},{id:2,data:8},{id:3,data:7},{ddd:1,{id:1},{id:3,数据:1}]},
结果=数组。从(初始数组
.减少(
(m,{name,value})=>value.reduce(
(n,{id,data})=>n.set(id,Object.assign(
n、 获取(id)|{id},
{[名称]:数据}
)),
M
),
新地图
)
.values()
);
console.log(结果);
.as console wrapper{max height:100%!important;top:0;}
以下是我认为可读的内容(注意,我投票结束您的问题是因为“主要基于观点”):
initial=[{
名称:“aaa”,
价值:[
{id:1,数据:1},
{id:2,数据:2},
{id:3,数据:3}
]
}, {
名称:“bbb”,
价值:[
{id:1,数据:4},
{id:2,数据:5},
{id:3,数据:6}
]
}, {
名称:“ccc”,
价值:[
{id:1,数据:7},
{id:2,data:8},
{id:3,数据:7}
]
}, {
名称:“ddd”,
价值:[
{id:1,数据:2},
{id:2,数据:1},
{id:3,数据:1}
]
}];
map={};
最终=[];
对于(i=0;i }
似乎有点让事情复杂化。Alex的答案更有效。@ajyvardan Alex的答案并不更好,两个答案都给出了预期的结果。你可以认为Alex的答案更具可读性,但这只是你的观点。和许多人一样,你认为可读性是编程最重要的方面,但这是一种天真的思维方式你最好考虑一下表演。我对你被删除的问题有一个答案。如果你能再次发表你的问题,我可以给你解决问题的办法。