【问题标题】:List sequential subset elements in Javascript列出 Javascript 中的顺序子集元素
【发布时间】:2023-03-24 16:15:01
【问题描述】:

我有一个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;
}

但这给出了所有可能的子集(并且当列表变大而搜索子集很小时很容易变慢)-我只需要如上所示的“顺序”子集-就像[1,2,3] 可以 - 但不是[1,2,4] ..

有聪明人知道如何在 JavaScript 中做到这一点吗?

【问题讨论】:

  • 迭代数组,递增索引,按顺序抓取3个元素,不越界。
  • 只需迭代直到a.length - 3,并在每次迭代时将a.slice(i, i + 3)推送到结果。

标签: javascript arrays combinations combinatorics


【解决方案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 原型中。如果您出于某种原因需要这样做,没有什么能阻止您这样做,但我会避免这样做。

【讨论】:

    【解决方案2】:

    试试这个:

    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 ??
    }
    

    【讨论】:

      猜你喜欢
      • 2010-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-27
      • 2023-03-08
      • 1970-01-01
      • 1970-01-01
      • 2017-03-22
      相关资源
      最近更新 更多