在Javascript中列出顺序子集元素

时间:2015-04-06 19:33:05

标签: javascript arrays combinations combinatorics

我有Array a = [0,1,2,3,4,5,6] 我希望用3个元素进行子集化,结果就是这样:

[0,1,2],[1,2,3],[2,3,4],[3,4,5],[4,5,6]

我尝试使用我发现的脚本:

Array.prototype.combinate = function( iItems, aIn ) {
    if (!aIn) {
        var aIn = new Array();
        this.combinate.aResult = new Array();
    }

    for(var i = 0; i < this.length; i++) {
        var a = aIn.concat(this[i]);
        var aRest = this.concat(); // Concat with nothing to create copy
        aRest.splice(0, i + 1);

        if(iItems && iItems - 1 <= aRest.length) {
            aRest.combinate(iItems - 1, a);
            if(iItems == 1) this.combinate.aResult.push(a);
        }
    }

    return this.combinate.aResult;
}

但这会给出所有可能的子集(当列表变大且搜索子集很小时变得很慢) - 我只需要&#34;顺序&#34;如上所示的子集 - 所以像[1,2,3] 一样好 - 但不是[1,2,4] ..

那些知道如何在JavaScript中执行此操作的聪明人......?

2 个答案:

答案 0 :(得分:1)

假设有问题的数组不需要先以某种方式排序,我会这样做:

function combinate(arr) {
  var results = [];

  if (arr.length >= 3) {
    for (var i = 0; i < arr.length - 2; i++) {
      var slice = arr.slice(i, i + 3);
      results.push(slice);
    }
  }

  return results;
}

作为补充说明,我建议不要添加类似这样的方法作为Array原型。如果出于某种原因需要,没有什么可以阻止你这样做,但我会避免它。

答案 1 :(得分:0)

试试这个:

for (var i = 0; i < arr.length - 2; i++) {
    var combination = new Array(arr[i], arr[i + 1], arr[i + 2]);
    // or this
    // var combination = [arr[i], arr[i + 1], arr[i + 2]];
    // do something with the new array ??
}