JavaScript中如何对已分组数据按ECTS进行二次分组?
对d3.nest生成的分组数据按ECTS二次分组
你可以通过遍历原数组的每个分组,结合d3.nest或者Lodash的_.groupBy来实现二次分组,同时处理每个项只保留Id字段。下面是两种可行的实现方式:
方法一:使用d3.nest完成二次分组
既然你已经熟悉d3.nest,我们可以直接在原分组的基础上,对每个values数组再做一次嵌套分组:
const originalArray = [ {key: "6S", values: [{Id: "1234a", ECTS: 3}, {Id: "1234b", ECTS: 3}]}, {key: "7S", values: [{Id: "1534a", ECTS: 5}, {Id: "154b", ECTS: 4}]} ]; const result = originalArray.map(group => { // 对当前分组的values按ECTS分组,同时转换每个项只保留Id const nested = d3.nest() .key(d => d.ECTS) .rollup(values => values.map(item => ({Id: item.Id}))) .entries(group.values); // 把entries格式转换成对象形式(key为ECTS值,值为Id数组) const valuesObj = nested.reduce((acc, item) => { acc[item.key] = item.value; return acc; }, {}); return { key: group.key, values: valuesObj }; }); console.log(result);
方法二:使用Lodash的_.groupBy实现
你之前用_.groupBy没成功,大概率是没处理好分组后的转换和结构整理。这里我们可以这样做:
const originalArray = [ {key: "6S", values: [{Id: "1234a", ECTS: 3}, {Id: "1234b", ECTS: 3}]}, {key: "7S", values: [{Id: "1534a", ECTS: 5}, {Id: "154b", ECTS: 4}]} ]; const result = originalArray.map(group => { // 按ECTS分组 const grouped = _.groupBy(group.values, 'ECTS'); // 遍历每个分组,把项转换成只含Id的对象 const valuesObj = _.mapValues(grouped, items => items.map(item => ({Id: item.Id}))); return { key: group.key, values: valuesObj }; }); console.log(result);
说明
两种方法都会输出你期望的格式:
[ {key: "6S", values: { "3": [{Id: "1234a"}, {Id: "1234b"}]}}, {key: "7S", values: { "5": [{Id: "1534a"}], "4": [{Id:"154b"}]}} ]
注意:ECTS值会以字符串形式作为key(因为d3.nest的key默认返回字符串,Lodash的_.groupBy对于数字类型的key也会转成字符串),如果需要数字类型的key,可以在分组后手动转换,比如acc[Number(item.key)] = item.value。
内容的提问来源于stack exchange,提问作者Catalin Vasilescu
相关产品推荐
相关产品推荐

