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的答案更具可读性,但这只是你的观点。和许多人一样,你认为可读性是编程最重要的方面,但这是一种天真的思维方式你最好考虑一下表演。我对你被删除的问题有一个答案。如果你能再次发表你的问题,我可以给你解决问题的办法。