JavaScript:如何按数值差值(超100时)对数组分组?
用Reduce或Underscore实现数组按相邻差值分组
嘿,这个需求用Array.prototype.reduce()来实现简直是绝佳选择,代码简洁还贴合函数式编程的思路,完全能替代常规的for循环写法。我直接给你上完整的实现:
原生Reduce版本
const arr = [100, 200, 300, 500, 600, 700, 1000, 1100, 1200]; const result = arr.reduce((acc, current, index) => { // 如果是第一个元素,直接创建新分组 if (index === 0) { acc.push([current]); return acc; } // 获取当前最后一个分组 const lastGroup = acc[acc.length - 1]; // 对比当前元素和分组最后一个元素的差值 if (current - lastGroup[lastGroup.length - 1] > 100) { // 差值超过100,新建分组 acc.push([current]); } else { // 差值符合要求,加入当前分组 lastGroup.push(current); } return acc; }, []); console.log(result); // 输出: [[100, 200, 300], [500, 600, 700], [1000, 1100, 1200]]
逻辑解释
- 初始化一个空数组作为累加器
acc,用来存储最终的分组结果 - 遍历数组时,第一个元素直接创建新分组加入累加器
- 后续元素和当前最后一个分组的最后一个元素做差值判断:
- 差值超过100就新建分组
- 否则就把当前元素加入最后一个分组
Underscore/Lodash版本
如果你习惯用Underscore,也可以用_.reduce()来实现,逻辑和原生版本完全一致,只是调用方式稍有不同:
const arr = [100, 200, 300, 500, 600, 700, 1000, 1100, 1200]; const result = _.reduce(arr, (acc, current, index) => { if (index === 0) { acc.push([current]); return acc; } const lastGroup = _.last(acc); if (current - _.last(lastGroup) > 100) { acc.push([current]); } else { lastGroup.push(current); } return acc; }, []); console.log(result); // 同样得到目标输出
这个写法比常规for循环更简洁,而且函数式的风格也更易读和维护,完全满足你的需求~
内容的提问来源于stack exchange,提问作者arjary
相关产品推荐
相关产品推荐

