我正在尝试做与展平数组相反的事情。
我有以下 4 元素的输入 JSON 数组:
[
{
"nestedObj": {
"id":12
}
},
{
"nestedObj": {
"id":555
}
},
{
"nestedObj": {
"id":555
}
},
{
"nestedObj" :{
"id":771
}
}
]
我想将它转换为一个数组的数组,其中每个子数组都将相同nestedObj.id
的元素组合在一起。
我可以假设初始 JSON 按 nestedObj.id
排序。
在上面的示例中,nestedObj
的第 2 个和第 3 个元素的 id
相同(555
),因此这些元素将是分组到一个子阵列中。
这将是一个包含只有 3 个 子数组元素的数组:
[
[{
"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;
}
但是正如您所见...代码是非常声明性的。从函数式编程的 Angular 来看,它不太像 JavaScript。
我如何使用例如重写它reduce 或其他“现代 JS”技术?
最佳答案
只需将对象分组即可。
let array = [{ nestedObj: { id: 12 } }, { nestedObj: { id: 555 } }, { nestedObj: { id: 555 } }, { nestedObj: { id: 771 } }],
result = Object.values(array.reduce((r, o) => {
(r[o.nestedObj.id] = r[o.nestedObj.id] || []).push(o);
return r;
}, {}));
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
关于javascript - 将数组转换为数组的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63441368/