You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 06:56:16