JavaScript 数组 - 查找两个元素的组合数量

5

我来自Ruby背景,在Ruby中有一个enumerable类。在Ruby中,我可以轻松地找到数组元素的组合。

array.combination(2).count

我知道JavaScript没有这样的内置函数,所以我想知道如何在JS中实现这个功能。我的想法是类似这样的:
我有一个数组如下:
var numbers = [9,7,12]
var combos = []
for (var i = 0; i < numbers.length; i++)  {
  combos.push([numbers[i], numbers[i+1])
}

顺便说一下,可能的组合有:

[9,7], [9,12] and [7,12]

通过调用该数组的长度函数,将返回3。

有什么想法?


顺序重要吗?例如:[9,7] 和 [7,9],它们被认为是不同的吗? - EyeOfTheHawks
我认为这应该被视为“重复组合”。它们都考虑了相同的两个数字,因此它们应该是相同的。我正在寻找所有不同数字的组合。 - Josh Winters
3个回答

4

怎么样:

for (var i = 0; i < numbers.length; i++)
    for (var j = i + 1; j < numbers.length; j++)
        combos.push([numbers[i], numbers[j]]);

太棒了的解决方案。看起来这是使用多重递归。谢谢@JuniorCompressor。 - Josh Winters
2
@JoshWinters 这只是一个嵌套的for循环,没有递归。 - EyeOfTheHawks
对不起,我是说多次迭代。 - Josh Winters
@JoshWinters:这里是硬编码为“2”。你想实现Ruby的“combination()”,对吧? - Lye Fish
你说得对,这只适用于2。学习如何使用combination(n)是很有趣的。 - Josh Winters

1

你是在严格讨论数组的2个元素组合,还是对k个元素组合的解决方案感兴趣?

在这里找到了这个gist

function k_combinations(set, k) {
var i, j, combs, head, tailcombs;

if (k > set.length || k <= 0) {
    return [];
}

if (k == set.length) {
    return [set];
}

if (k == 1) {
    combs = [];
    for (i = 0; i < set.length; i++) {
        combs.push([set[i]]);
    }
    return combs;
}

// Assert {1 < k < set.length}

combs = [];
for (i = 0; i < set.length - k + 1; i++) {
    head = set.slice(i, i+1);
    tailcombs = k_combinations(set.slice(i + 1), k - 1);
    for (j = 0; j < tailcombs.length; j++) {
        combs.push(head.concat(tailcombs[j]));
    }
}
return combs;
}

这个问题特别涉及到两个元素的组合。但是谢谢,这也可能会有用。 - Josh Winters
你可以根据自己的需求修改这个代码(实际上让它更少模块化,更具体化)。 - Cihan Köseoğlu

0
这是一个递归函数,可以适用于任何数字:
function combination(arr, num) {
  var r= [];

  for(var i = 0 ; i < arr.length ; i++) {
    if(num===1) r.push([arr[i]]);
    else {
      combination(arr.slice(i+1), num-1).forEach(function(val) {
        r.push([].concat(arr[i], val));
      });
    }
  }
  return r;
} //combination

工作的Fiddle


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接