如何对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
相关产品推荐
相关产品推荐

