按相邻整数属性对对象数组(集合)进行分组的实现方法
按连续递增int属性分组对象数组的解决方案
嘿,刚好处理过类似的需求!既然原数组已经按int属性排好序了,用Array.prototype.reduce()就能轻松实现你要的分组效果,把相邻且int值满足n+1连续递增的对象归为同一组。
完整实现代码
const value = [{int: 1}, {int: 2}, {int: 3}, {int: 15}, {int: 16}, {int: 21}]; const result = value.reduce((acc, current) => { // 初始化第一个分组 if (acc.length === 0) { acc.push([current]); return acc; } // 获取最后一个分组的最后一个元素 const lastGroup = acc[acc.length - 1]; const lastElement = lastGroup[lastGroup.length - 1]; // 判断是否满足连续递增条件 if (current.int === lastElement.int + 1) { lastGroup.push(current); } else { // 不连续则新建分组 acc.push([current]); } return acc; }, []); console.log(result); // 输出结果:[[{int:1}, {int:2}, {int:3}], [{int:15}, {int:16}], [{int:21}]]
逻辑拆解
- 用
reduce的累加器acc来存储最终的分组嵌套数组,初始值设为空数组。 - 遍历每个对象时:
- 如果累加器为空,直接把当前对象包装成数组作为第一个分组加入。
- 若已有分组,就取最后一个分组的最后一个元素,对比当前对象的
int值是否等于上一个元素的int + 1。 - 满足连续条件就把当前对象加入最后一个分组;不满足则新建一个分组加入累加器。
简化版写法(ES6+)
如果喜欢更简洁的代码,可以用Array.prototype.at()来快速获取最后一个元素,省去计算索引的步骤:
const result = value.reduce((acc, curr) => { const lastGroup = acc.at(-1); if (lastGroup && curr.int === lastGroup.at(-1).int + 1) { lastGroup.push(curr); } else { acc.push([curr]); } return acc; }, []);
内容的提问来源于stack exchange,提问作者ThomasReggi
相关产品推荐
相关产品推荐

