如何按classNumber合并嵌套数组对象并聚合status属性值
解决嵌套数组合并:按classNumber分组合并status属性
别担心,这个问题其实可以通过两步轻松解决:先把多层嵌套的数组扁平化,再按classNumber分组合并对应的属性。我给你两种方案,原生JS和Lodash的,都能实现需求。
原生JavaScript实现
步骤1:扁平化嵌套数组
首先用flat()方法把你的多层嵌套数组转成一维数组,这样后续处理更简单:
const nestedArray = [ [ { classNumber: '2', status: 'A', terms: [] }, { classNumber: '32', status: 'B', terms: [] }, { classNumber: '44', status: 'C', terms: [] } ], [ { classNumber: '2', status: 'B', terms: [] }, { classNumber: '31', status: 'A', terms: [] } ] ]; // 扁平化数组 const flattenedArray = nestedArray.flat();
步骤2:分组合并属性
用reduce()遍历扁平化后的数组,以classNumber为键构建临时对象,收集相同class的status,最后转成目标数组:
const mergedResult = Object.values(flattenedArray.reduce((acc, currentItem) => { // 如果当前classNumber还没在累加器里,初始化条目 if (!acc[currentItem.classNumber]) { acc[currentItem.classNumber] = { classNumber: currentItem.classNumber, status: [], terms: currentItem.terms // 假设同class的terms一致,直接取当前项的 }; } // 将当前status加入数组(如果需要去重可以加判断) acc[currentItem.classNumber].status.push(currentItem.status); return acc; }, {})); console.log(mergedResult); // 输出就是你想要的结构: // [ // { classNumber: '2', status: [ 'A', 'B' ], terms: [] }, // { classNumber: '32', status: [ 'B' ], terms: [] }, // { classNumber: '44', status: [ 'C' ], terms: [] }, // { classNumber: '31', status: [ 'A' ], terms: [] } // ]
可选:去重status
如果你的数据里可能出现同一个classNumber重复的status,可以用Set来去重:
acc[currentItem.classNumber].status = [...new Set([ ...acc[currentItem.classNumber].status, currentItem.status ])];
Lodash实现
如果你还是想用Lodash,试试这个组合方法:
const _ = require('lodash'); const mergedResult = Object.values(_.mapValues( // 先扁平化数组,再按classNumber分组 _.groupBy(_.flatMap(nestedArray), 'classNumber'), // 处理每个分组,生成目标结构 (group) => ({ classNumber: group[0].classNumber, status: _.map(group, 'status'), // 提取所有status组成数组 terms: group[0].terms }) ));
这里_.flatMap负责扁平化数组,_.groupBy按classNumber分组,最后_.mapValues把每个分组转换成你需要的对象结构。
核心思路就是先把嵌套结构拆平,再按唯一标识(classNumber)聚合属性,这样不管嵌套多少层都能处理。
内容的提问来源于stack exchange,提问作者Sonhja
相关产品推荐
相关产品推荐

