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

如何对cars数组分组,使相同make的对象不在同一分组?

实现数组分组:确保相同品牌的对象不在同一组

嘿,我来帮你搞定这个分组需求!给定你提供的cars数组,我们要实现的是让相同make字段的对象不会出现在同一分组,核心思路有点像玩扑克牌时的“发牌”——先把同品牌的归到一起,再轮流把每个品牌的元素分配到不同组里,这样就能避免同品牌扎堆的情况。

第一步:先按品牌分组

首先我们需要把原数组里的对象按make字段归类,方便后续“发牌”操作:

var cars = [
  { 'make': 'audi', 'model': 'r8', 'year': '2012' },
  { 'make': 'audi', 'model': 'rs5', 'year': '2013' },
  { 'make': 'ford', 'model': 'mustang', 'year': '2012' },
  { 'make': 'ford', 'model': 'fusion', 'year': '2015' },
  { 'make': 'kia', 'model': 'optima', 'year': '2012' },
];

// 先按make分组,得到{ audi: [...], ford: [...], kia: [...] }
const groupedByMake = cars.reduce((acc, car) => {
  if (!acc[car.make]) {
    acc[car.make] = [];
  }
  acc[car.make].push(car);
  return acc;
}, {});

第二步:模拟“发牌”式分配分组

接下来我们创建分组,轮流从每个品牌的列表里取元素,直到所有元素都被分配完成:

// 获取所有品牌的列表数组
const makeLists = Object.values(groupedByMake);
// 初始化分组结果(分组数量会自动匹配最多元素的品牌数量)
const groups = [];
// 记录每个品牌列表当前取到的索引位置
const indices = new Array(makeLists.length).fill(0);
// 标记是否还有未分配的元素
let hasRemaining = true;

while (hasRemaining) {
  hasRemaining = false;
  // 遍历每个品牌的列表
  makeLists.forEach((list, idx) => {
    const currentIndex = indices[idx];
    if (currentIndex < list.length) {
      // 如果当前组还没创建,就新增一个组
      if (!groups[currentIndex]) {
        groups[currentIndex] = [];
      }
      // 把当前元素加到对应组里
      groups[currentIndex].push(list[currentIndex]);
      // 移动当前品牌列表的指针
      indices[idx]++;
      // 标记还有未分配元素
      hasRemaining = true;
    }
  });
}

console.log(groups);

输出结果说明

运行上面的代码后,你会得到这样的分组结果:

[
  [ { make: 'audi', model: 'r8', year: '2012' }, { make: 'ford', model: 'mustang', year: '2012' }, { make: 'kia', model: 'optima', year: '2012' } ],
  [ { make: 'audi', model: 'rs5', year: '2013' }, { make: 'ford', model: 'fusion', year: '2015' } ]
]

可以看到,同一品牌的对象都被分到了不同的组里,完全符合你的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:23:39