如何按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);
逻辑说明:
- 用
reduce遍历原数组,以空对象作为初始累加器,存储superset_id到分组数组的映射。 - 遍历每个训练项时,以其
superset_id为键,将训练项推入对应数组;若键不存在则先创建空数组。 - 最后通过
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);
逻辑说明:
Map会严格保留键的插入顺序,遍历原数组时,首次出现的superset_id会被优先存入Map。- 最后通过
Array.from(map.values())将Map中的分组数组转为二维数组。
内容的提问来源于stack exchange,提问作者herbie
相关产品推荐
相关产品推荐

