【问题标题】:Filter an Array of Values and group them过滤值数组并将它们分组
【发布时间】:2019-12-01 01:03:28
【问题描述】:

我有一个数组,我需要对其进行排序并将过于相似的值放在另一个数组中。

例如

function group (arrData) {
   for (let i = 0; i < array.length - 1; i++) {
     if (
         (array[i + 1] - array[i]
        ) < 5) {
           return array[i];
     }
   }
 }

const arr = [1,15,16,33,35,37,55,58]
const newArr = arr.map((item,index,array) => group(array));

但它只返回一个值。我该如何解决这个问题?

至于所需的输出:[[15,16],[33,35,36],[55,58]]

【问题讨论】:

  • 想要的输出是什么?
  • 值是否总是排序的?

标签: javascript arrays filtering


【解决方案1】:

您可以对数组进行排序,如果不是按升序排列,然后通过检查实际值和前一个值来减少该数组。

如果 dela 大于或等于5 或者如果你得到了数组的第一个值,则将一个空数组推送到结果集。

然后将值推送到结果集中的最后一个数组。

var array = [1, 15, 16, 33, 35, 37, 55, 58],
    result = array
        .sort((a, b) => a - b)                       // not necessary with sorted data
        .reduce((r, v, i, a) => {
            if (!i || v - a[i - 1] >= 5) r.push([]);
            r[r.length - 1].push(v);
            return r;
        }, []);

console.log(result);

【讨论】:

  • sort 回调函数不是必需的,因为它是默认行为
  • @Avraham,不,没有回调就无法工作,因为内置的默认回调按值的字符串表示形式排序。这意味着,例如,1001 之后和16 之前排序。
  • 为什么&gt;=5,此输入的代码失败array = [1, 15, 16, 30, 39, 40, 55, 58]
  • @ŞivāSankĂr,到底是什么失败了?如果需要,您可以更改比较值。
  • @ŞivāSankĂr,没有。该问题的增量小于 5 作为同一组的条件。你与Math.floor(value / 10) 组队。这是一个不同的问题。
猜你喜欢
  • 2020-12-21
  • 2020-07-03
  • 1970-01-01
  • 1970-01-01
  • 2013-03-27
  • 1970-01-01
  • 1970-01-01
  • 2021-02-18
  • 1970-01-01
相关资源
最近更新 更多