【问题标题】:Split arrays based on sequences javascript基于序列javascript拆分数组
【发布时间】:2013-06-02 18:55:58
【问题描述】:

我有一个类似的数组

var arr = [12, 13, 14, 17, 18, 19, 20]

我想知道如何遍历数组,以便可以根据序列将此数组拆分为 2 个数组?即基本上如果i+1 != true 使它成为一个新数组

var arr = [12, 13, 14]
var arr2 = [17,18,19,20]

我正在使用 lodash 并尝试了一些使用 splicefor 语句,但我有点困惑?感谢任何帮助

【问题讨论】:

  • 请提供更多信息,请问您想如何拆分 - 3 个元素之后的拆分非常简单,您只需要这些吗?
  • 2 个数组等于一半?
  • 我需要拆分来识别序列何时停止?即 12、13、14 - 然后有一个休息时间,直到 17、18、19 点才重新开始。即i+1 != true split to new array

标签: javascript for-loop underscore.js lodash


【解决方案1】:

Example on jsFiddle

var a = [1, 2, 3, 5, 6, 7];

var r = [];
var t = [];

for (var i = 0; i < a.length; ++i)
{
    if (i == 0)
    {
        t.push(a[i]); // add the first element and continue
        continue;
    }
    if (a[i - 1] != (a[i] - 1))
    {
        // if the current is not sequential
        // add the current temporary array to arrays result
        r.push(t);

        // clear the temporary array and start over
        t = [];
    }

    t.push(a[i]);
}
r.push(t);

r 将包含您的所有数组

Minified version

function seq(e,t,n,r){t=[];n=[];for(r=0;r<e.length;++r){if(!r){n.push(e[r]);continue}if(e[r-1]!=e[r]-1){t.push(n);n=[]}n.push(e[r])}t.push(n);return t}

var result = seq([1, 2, 3, 5, 6, 7]);

【讨论】:

    【解决方案2】:

    这是另一种更密集的方法,它使用下划线非常方便的groupByvalues 方法:

    var origin = [12,13,14,15,17,18,19,21,22,23];
    var c = 0, result = _.values( _.groupBy(origin, function(el, i, arr) { 
      return i ? c+= (1 !== el - arr[i-1]) : 0; }) );
    

    因此,result 存档将包含所有序列作为元素。这是要玩的JSFiddle

    解释:groupBy 在回调的帮助下对源数组进行分组(每次当前处理的元素 (el) 与前一个元素 (arr[i-1]) 之间的差值大于1.它返回一个对象,所以我必须通过_.values;你可能会也可能不会这一步。

    我想知道是否可以请求类似groupByInArray 的功能?实现起来应该很简单,但在这种情况下可能非常有用。

    【讨论】:

    • 太棒了!多谢了。是的,我认为像 groupBy 这样的东西会很棒。我什至有像[[12, 0], [13, 0], [14, 0], [18,0], [19,1], [20,0]] 这样的场景,我也需要拆分它吗?所以它就像[[12, 0], [13, 0], [14, 0]][[18,0], [19,1], [20,0]]
    • 如果我对您的理解正确,您可以重用此功能,只需稍作改动:将检查el - arr[i-1] 替换为el[0] - arr[i-1][0]Demo
    • 是的,太棒了!多谢了。我只是想知道我的意思是如果你有一个groupByInArray 它也将支持这些场景!将是下划线库的虚幻添加
    • 我的意思是对 Underscore 库本身的拉取请求。
    • 啊,我什至不知道有这样的东西存在,听起来和看起来就像 haskell(至少有点),喜欢它:)
    【解决方案3】:

    你是说喜欢this吗?

    function split(arr) {
        var res = [];
        var subres = [];
        for (var i = 0; i < arr.length; i++) {
            var length = subres.length;
            if (length === 0 || subres[length - 1] === arr[i] - 1) {
                subres.push(arr[i]);
            } else {
                res.push(subres);
                subres = [arr[i]];
            }
        }
        res.push(subres);
        return res;
    }
    

    【讨论】:

    • 是的!多谢。如果您熟悉这些,我不确定使用 lodash 或下划线是否可以更快?
    • @Andy 使用任何一个库都不会更快。
    【解决方案4】:

    试试这个:)

    var array = [12,13,14,4567,789,0]; //e.g.
    var index;
    var previous = array[0];
    for (var index = 1; index++; index < array.length) {
      if (previous + 1 == array[index]) {
        previous = array[index]; //++
      } else {
        break;
      }
    }
    var firstPart = array.slice(0, index + 1);
    var secondPart = array.slice(index + 1);
    

    http://jsfiddle.net/zajnH/

    【讨论】:

      猜你喜欢
      • 2019-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-28
      相关资源
      最近更新 更多