首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用underscore.js对javascript中没有空格的数字序列进行分组

使用underscore.js对javascript中没有空格的数字序列进行分组
EN

Stack Overflow用户
提问于 2017-03-09 03:48:44
回答 3查看 1.1K关注 0票数 3

有了一个数字数组[1, 2, 3, 4, 7, 8, 11, 15, 16, 17, 18],我们如何使用underscore.js将它们分组成连续的数字。

因此,期望的输出是4组(1-4、7-8、11和15-18) [[1, 2, 3, 4], [7, 8], [11], [15, 16, 17, 18]]

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-03-09 04:00:18

我只需要使用reduce就可以了,不用担心另一个库。

代码语言:javascript
运行
复制
[1, 2, 3, 4, 7, 8, 11, 15, 16, 17, 18].reduce((arr, val, i, a) => {
  if (!i || val !== a[i - 1] + 1) arr.push([]);
  arr[arr.length - 1].push(val);
  return arr;
}, []);

代码语言:javascript
运行
复制
var result = [1, 2, 3, 4, 7, 8, 11, 15, 16, 17, 18].reduce((arr, val, i, a) => {
  if (!i || val !== a[i - 1] + 1) arr.push([]);
  arr[arr.length - 1].push(val);
  return arr;
}, []);

console.log(result);

票数 10
EN

Stack Overflow用户

发布于 2017-03-09 03:48:44

第一次张贴一个问题,并立即回答自己。我想其他人可能需要这样做,我想把这个保存下来以备将来参考。

this C# solution的启发,我编写了以下underscore.js mixin:

代码语言:javascript
运行
复制
_.mixin({
  groupByAdjacent: (list, iteratee) => {
    let i = 0;
    let length = 0;

    const groupList = [];
    let group = [list[0]];
    let pred = list[0];

    for (i = 1, length = list.length; i < length; i++) {
      if (iteratee(pred, list[i])) {
        group.push(list[i]);
      } else {
        groupList.push(group);
        group = [list[i]];
      }
      pred = list[i];
    }
    groupList.push(group);

    return groupList;
  },
});

用法如下:

代码语言:javascript
运行
复制
const numbers = [1, 2, 3, 4, 7, 8, 11, 15, 16, 17, 18];
const groupsOfNumbers = _.groupByAdjacent(numbers, (x, y) => {
    return ((parseInt(x, 10) + 1) == parseInt(y, 10))
});

console.log(groupsOfNumbers);

或者,如果您需要在属性中对具有连续编号的对象进行分组,我们也可以对对象进行分组:

代码语言:javascript
运行
复制
const numbersInObjects = [{ n: 1 }, { n: 2 }, { n: 3 }, { n: 4 }, { n: 7 }, { n: 8 }, { n: 11 }, { n: 15 }, { n: 16 }, { n: 17 }, { n: 18 }];
const groupsOfNumbersInObjects = _.groupByAdjacent(numbersInObjects, (x, y) => {
    return ((parseInt(x.n, 10) + 1) == parseInt(y.n, 10))
});

如果有人能把它变短,那就太好了!我希望摆脱for循环,但是我需要跳过第一项,这样_.each就不能工作了。

票数 0
EN

Stack Overflow用户

发布于 2017-03-09 04:13:54

有点乱七八糟,但很管用...(:

代码语言:javascript
运行
复制
function group(arr){
    result = [],
    array = [],
    bool = true;

    arr.forEach(function(v,i){
      if (v == (arr[i+1] - 1)) {
        if (bool) { array.push(v); bool = false;}
        array.push(arr[i+1]);
      } else if ((v != arr[i-1] + 1) && (v != arr[i+1] - 1)) {
        result.push([v]);
      } else {
        result.push(array);
        array = [];
        bool = true;
      }
    });
    
    console.log(result);
}

group([1, 2, 3, 4, 7, 8, 11, 15, 16, 17, 18]);

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42680647

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档