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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 04:08:29