Javascript 将数组转换为数组的数组
我试图做一个与展平阵列相反的事情 我有以下4个元素的输入JSON数组:Javascript 将数组转换为数组的数组,javascript,arrays,reduce,Javascript,Arrays,Reduce,我试图做一个与展平阵列相反的事情 我有以下4个元素的输入JSON数组: [ { "nestedObj": { "id":12 } }, { "nestedObj": { "id":555 } }, { "nestedObj": { "id":555 } }, {
[
{
"nestedObj": {
"id":12
}
},
{
"nestedObj": {
"id":555
}
},
{
"nestedObj": {
"id":555
}
},
{
"nestedObj" :{
"id":771
}
}
]
[
[{
"nestedObj": {
"id":12
}
}],
[{
"nestedObj": {
"id":555
}
},
{
"nestedObj": {
"id":555
}
}],
[{
"nestedObj" :{
"id":771
}
}]
]
我想将其转换为一个数组数组,其中每个子数组都有相同nestedObj.id
的元素组合在一起
我可以假设初始JSON是按nestedObj.id
排序的
在上面的示例中,第二个和第三个元素的nestedObj
的id
是相同的(555
),因此这些元素将被分组到一个子数组中
这将导致一个只包含3个子数组元素的数组:
[
{
"nestedObj": {
"id":12
}
},
{
"nestedObj": {
"id":555
}
},
{
"nestedObj": {
"id":555
}
},
{
"nestedObj" :{
"id":771
}
}
]
[
[{
"nestedObj": {
"id":12
}
}],
[{
"nestedObj": {
"id":555
}
},
{
"nestedObj": {
"id":555
}
}],
[{
"nestedObj" :{
"id":771
}
}]
]
这就是我想要的代码:
const data = [ /* ...the above input data... */ ];
let result = [];
let prevId = null;
for (let elem of data) {
let currId = elem.nestedObj.id;
if (currId === prevId) {
result[result.length - 1].push({...elem});
} else {
result.push([{...elem}]);
}
prevId = currId;
}
但正如你所看到的。。。代码是非常声明性的。从函数式编程的角度来看,它不像JavaScript
如何使用reduce或其他“现代JS”技术重新编写它?只需将对象分组即可
let数组=[{nestedObj:{id:12},{nestedObj:{id:555},{nestedObj:{id:555}},{nestedObj:{id:771}],
结果=对象.values(数组.reduce((r,o)=>{
(r[o.nestedObj.id]=r[o.nestedObj.id]| |[])。推(o);
返回r;
}, {}));
控制台日志(结果)代码>
.as console wrapper{max height:100%!important;top:0;}
您可以使用函数reduce
按id分组,使用函数Object.values
提取分组值,最后映射数组以生成所需的输出
这是假设我们只有一个名为nestedObj
let arr=[{nestedObj:{id:12},{nestedObj:{id:555},{nestedObj:{id:555}},{nestedObj:{id:771}],
result=Object.values(arr.reduce((a,{nestedObj:{id}})=>{
(a[id]| |(a[id]=[])。推送(id);
返回a;
}.map(r=>r.map(id=>({nestedObj:{id}}));
控制台日志(结果)代码>
.as控制台包装{max height:100%!important;top:0;}
使用映射对具有相同id的项目进行分组,然后从映射中获取最终值
const data=[{nestedObj:{id:12},{nestedObj:{id:555},{nestedObj:{id:555},{nestedObj:{id:771}]
常量映射=新映射;
data.forEach(o=>{
常数{nestedObj:{id}}=o;
map.has(id)?map.get(id).push(o):map.set(id[o]);
});
但是,console.log([…map.values()])
第二个和第三个元素(具有相同的id)没有组合在一起。