按值对数组对象进行分组-javascript

按值对数组对象进行分组-javascript,javascript,arrays,javascript-objects,Javascript,Arrays,Javascript Objects,我试图根据对数组值的一些操作,找出将一个数组分组为多个数组的最佳方法 例如,我的数组看起来像 var arr = [100, 200, 300, 500, 600, 700, 1000, 1100, 1200] 当差异超过100时,我需要将上面的数组分组为不同的数组 因此,我的输出如下所示: var result = [[100, 200, 300], [500, 600, 700], [1000, 1100, 1200]] 实现这一目标的最佳方式是什么 我尝试了传统的for循环,使用if条

我试图根据对数组值的一些操作,找出将一个数组分组为多个数组的最佳方法

例如,我的数组看起来像

var arr = [100, 200, 300, 500, 600, 700, 1000, 1100, 1200]
当差异超过100时,我需要将上面的数组分组为不同的数组

因此,我的输出如下所示:

var result = [[100, 200, 300], [500, 600, 700], [1000, 1100, 1200]]
实现这一目标的最佳方式是什么

我尝试了传统的for循环,使用if条件检查下一个元素与当前元素之间的差异,继续将其推送到数组中,当差异超过100时,创建一个新数组

我觉得需要有更好的方法来做

编辑:-

我试过下面的代码,虽然很接近,但不完整。没有花更多的时间在上面,因为我正在尝试使用reduce或下划线获得一个更简单的版本-

var result = [], temp = [], difference;
for (var i = 0; i < array.length; i += 1) {
 if (difference !== (array[i + 1] - array[i])) {
    if (difference !== undefined) {
        result.push(temp);
        temp = [];
    }
    difference = array[i + 1] - array[i];
}
temp.push(array[i]);
}

if (temp.length) {
  result.push(temp);
}
var结果=[],温度=[],差异;
对于(变量i=0;i
您可以使用
reduce
来完成此操作

var arr = [100, 200, 300, 500, 600, 700, 1000, 1100, 1200];

var groups = arr.reduce(function (a, b) {
  if (a.length === 0) { // First Iteration
    a.push([b]);
    return a;
  }

  var lastGroupIndex = a.length - 1;
  var lastGroup = a[lastGroupIndex];

  var lastElementIndex = lastGroup.length - 1;
  var lastElement = lastGroup[lastElementIndex];

  if (b - lastElement <= 100) { // Add to current group
    lastGroup.push(b);
    return a;
  }

  a.push([b]); // Create new group
  return a;
}, [])
var-arr=[100200300500600700100011001200];
var组=arr.REDUCT(功能(a,b){
如果(a.length==0){//第一次迭代
a、 推动([b]);
返回a;
}
var lastGroupIndex=a.length-1;
var lastGroup=a[lastGroupIndex];
var lastElementIndex=lastGroup.length-1;
var lastElement=lastGroup[lastElementIndex];

如果(b-lastElement这是一个有趣的问题

编辑:重读后,不清楚输入数组是否已排序。如果已排序,您可以查看reduce调用

一开始,我想知道是否有比O(nlogn)更优化的解决方案。但是,即使您正在对项目进行装箱,最终的巨型阵列仍然是完全排序的。因此,如果存在比O(nlogn)更快的方法来解决您的问题,您也可以比nlogn更快地解决排序问题

考虑到这一点,最简单的解决方案是对数组进行排序,然后在迭代过程中根据最后一个元素对其进行相应的分区。
Reduce
最终成为一个完美的工具:

const input=[100200300500600700100011001200];
const sorted=input.slice().sort((a,b)=>a-b);
const bucket=已排序。reduce((bucket,item,i)=>{
const lastBucket=bucket[bucket.length-1];
如果(i==0){
返回[[项目]];
}
const prev=已排序的[i-1];
如果(项目-上一个>100){
铲斗。推动([项目]);
}否则{
铲斗[bucket.length-1]。推送(项目);
}
返回铲斗;
}, [])

console.log(bucket);
因为在一个函数中使用reduce的完整参数没有答案:

var arrOrg = [100, 200, 300, 500, 600, 700, 1000, 1100, 1200]
arrOrg.reduce(function (acc, item, idx, arr) {
  if (idx) {
    (idx < arr.length && arr[idx + 1] > item + 100) // the spec condition
      ? acc[acc.length] = [item]
      : acc[acc.length - 1].push(item)
  } else acc[0][0] = item
  return acc
}, [[]])
当使用空数组调用时,它是否应该


另请注意,它不关心排序。

您能发布您为完成此任务而编写的代码吗?当然,只是编辑过。它不完整,不再在上面花费更多时间,因为我正在寻找使用reduce或下划线的更简单解决方案。问题假设数组已排序,不是吗?目标是如果下一个element比旧元素大100多个。是的,我不确定是的,有点混乱。你的答案也很好:).由于问题表明先前的解决方案使用了for循环,我假设不需要排序。我也这么做了,但使用了一些es6技巧使其更短:使用签名
函数组([first,…rest])
将reduce包装在函数中,然后使用
[[first]]初始化reduce
和reduce only
rest
由于问题使用了
var
而不是
let
来声明数组,因此我编写它时没有使用任何ES6细节,假设用户可能不在ES6上。问题没有说明需要排序。
[[]]