Javascript 将数组转换为数组的数组

Javascript 将数组转换为数组的数组,javascript,arrays,reduce,Javascript,Arrays,Reduce,我试图做一个与展平阵列相反的事情 我有以下4个元素的输入JSON数组: [ { "nestedObj": { "id":12 } }, { "nestedObj": { "id":555 } }, { "nestedObj": { "id":555 } }, {

我试图做一个与展平阵列相反的事情

我有以下4个元素的输入JSON数组:

[
  {
    "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)没有组合在一起。