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

如何按superset_id将对象数组分组为二维数组?

按superset_id分组生成二维数组的实现

方法一:使用reduce和Object.values

这是最常用的简洁实现方式,代码如下:

const workouts = [
  { id: 1, name: "Bench Press", superset_id: 1 },
  { id: 2, name: "Squats", superset_id: 2 },
  { id: 3, name: "Shoulder Press", superset_id: 1 },
  { id: 4, name: "Leg Press", superset_id: 2 }
];

// 分组逻辑
const groupedWorkouts = Object.values(
  workouts.reduce((acc, workout) => {
    const key = workout.superset_id;
    // 若当前superset_id未创建分组,则初始化空数组
    if (!acc[key]) {
      acc[key] = [];
    }
    // 将当前训练项加入对应分组
    acc[key].push(workout);
    return acc;
  }, {})
);

console.log(groupedWorkouts);

逻辑说明:

  1. 用reduce遍历原数组,以空对象作为初始累加器,存储superset_id到分组数组的映射。
  2. 遍历每个训练项时,以其superset_id为键,将训练项推入对应数组;若键不存在则先创建空数组。
  3. 最后通过Object.values提取累加器中的所有分组数组,得到目标二维数组。

方法二:使用Map严格保持分组顺序

如果需要分组顺序与原数组中首次出现的superset_id顺序完全一致(比如原数组先出现superset_id=2,分组结果就先展示该组),可以用Map实现:

const workouts = [
  { id: 1, name: "Bench Press", superset_id: 1 },
  { id: 2, name: "Squats", superset_id: 2 },
  { id: 3, name: "Shoulder Press", superset_id: 1 },
  { id: 4, name: "Leg Press", superset_id: 2 }
];

const map = new Map();
workouts.forEach(workout => {
  const key = workout.superset_id;
  if (!map.has(key)) {
    map.set(key, []);
  }
  map.get(key).push(workout);
});

const groupedWorkouts = Array.from(map.values());

console.log(groupedWorkouts);

逻辑说明:

  1. Map会严格保留键的插入顺序,遍历原数组时,首次出现的superset_id会被优先存入Map。
  2. 最后通过Array.from(map.values())将Map中的分组数组转为二维数组。

内容的提问来源于stack exchange,提问作者herbie

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 09:31:00