通用函数,用于在javascript中从数组中获取所有唯一的对、树等

通用函数,用于在javascript中从数组中获取所有唯一的对、树等,javascript,jquery,arrays,performance,underscore.js,Javascript,Jquery,Arrays,Performance,Underscore.js,我希望用javascript创建一个函数,它允许我传递一个长数组和一个参数。 我要找的是这样的东西: var ar = [1,2,3,4]; var pairs = superAwesomeFunction(ar,2) //=> [[1,2],[1,3],[1,4],[2,3],[2,4],[3,4]]; var trebles = superAwesomeFunction(ar,3) //=> [[1,2,3],[1,2,4],[1,3,4],[2,3,4] 理想情况下,函数对折

我希望用javascript创建一个函数,它允许我传递一个长数组和一个参数。 我要找的是这样的东西:

var ar = [1,2,3,4];
var pairs = superAwesomeFunction(ar,2) //=> [[1,2],[1,3],[1,4],[2,3],[2,4],[3,4]];
var trebles = superAwesomeFunction(ar,3) //=> [[1,2,3],[1,2,4],[1,3,4],[2,3,4]
理想情况下,函数对折叠参数没有限制。 我写了一段代码,看起来是这样的,它工作得很好,但它不是真正有用的,因为它不是通用的,我需要很多这样的函数,这看起来很愚蠢

  getAll2Folds: function (ar) {
    var combinations = [],
        numOdds = ar.length;
    for (var i = 0; i < numOdds; i++) {
      for (var j = i + 1; j < numOdds; j++) {
        combinations.push([ar[i], ar[j]]);
      }
    }
    return combinations;
  },

  getAll3Folds: function (ar) {
    var combinations = [],
        numOdds = ar.length;
    for (var i = 0; i < numOdds; i++) {
      for (var j = i + 1; j < numOdds; j++) {
        for (var k = j + 1; k < numOdds; k++) {
          combinations.push([ar[i], ar[j], ar[k]]);
        }
      }
    }
    return combinations;
    };

  },
getAll2Folders:函数(ar){
var组合=[],
numOdds=ar长度;
对于(var i=0;i
。。。(不太好:|)

GetAll8折叠:函数(ar){
var组合=[],
numOdds=ar长度;
对于(var i=0;i
}

我可以自由地使用下划线、jquery或任何我想要的工具,但找不到一个优雅的解决方案,这也会很好地执行。想法

感谢基本上
combine()
获取一个数组,其中包含要组合的值和所需组合结果集的大小

内部函数
c()。返回是一个包含所有组合的数组

第一个调用是allways
c([],0)
,因为结果数组为空,起始索引为0

var-arr=[1,2,3,4,5,6,7];
功能联合收割机(a、尺寸){
功能c(部分,开始){
var结果=[],i,l,p;
对于(i=开始,l=arr.length;i';
descriptionNode.appendChild(preNode);
}否则{
descriptionNode.innerHTML=s+'
'; } document.getElementById('out').appendChild(descriptionNode); }
  getAll8Folds: function (ar) {
var combinations = [],
    numOdds = ar.length;
for (var i = 0; i < numOdds; i++) {
  for (var j = i + 1; j < numOdds; j++) {
    for (var k = j + 1; k < numOdds; k++) {
      for (var l = k + 1; l < numOdds; l++) {
        for (var m = l + 1; m < numOdds; m++) {
          for (var n = m + 1; n < numOdds; n++) {
            for (var o = n + 1; o < numOdds; o++) {
              for (var p = o + 1; p < numOdds; p++) {
                combinations.push([ar[i], ar[j], ar[k], ar[l], ar[m], ar[n], ar[o], ar[p]]);
              }
            }
          }
        }
      }
    }
  }
}
return combinations;