【问题标题】:Trying to get all possible combinations using javascript尝试使用 javascript 获取所有可能的组合
【发布时间】:2012-02-21 19:49:44
【问题描述】:

我目前被这个问题困住了,

假设有一个数组 arr4(长度不固定)。 我需要找到它的元素的所有组合。

预期输出是:

4-16D-5d 
4-16D-5e
4A-16D-5d
4A-16D-5e
4B-16D-5d
4B-16D-5e

4-15D-5d
4-15D-5e
4A-15D-5d
4A-15D-5e
4B-15D-5d
4B-15D-5e

我尝试的是:

arr4=[['4','4A','4B'],['16D','15D'],['5d','5e']]; //may contains more elements
alert("arr4 "+arr4);
for(var k=0;k<arr4.length;k++){
    alert("k "+k);
    arr_v=arr4[k]
    alert("arrv"+arr_v);
    alert ("arrv lengt"+arr_v.length);
    for(var z=0;z<arr_v.length;z++){
        m=1;
        while(m<arr4.length){
            var test=arr4[m];
            for(var n=0;n<test.length;n++)
                alert(arr_v[z]+"<TEST>"+test[n]);
        }
        m++;
    }
}   

我找到了一个解决方案:

function product() {
    return Array.prototype.reduce.call(arguments, function(as, bs) {
        return [a.concat(b) for each (a in as) for each (b in bs)]
    }, [[]]);
}

但是

arr4=[['4','4A','4B'],['16D','15D'],['5d','5e']];
alert(product(['4','4A','4B'],['16D','15D'],['5d','5e']);

上述方法有效,但以下方法无效:

arr4=[['4','4A','4B'],['16D','15D'],['5d','5e']];
alert(product(arr4);

请大家提出解决方案

编辑:解决方案here

【问题讨论】:

  • 感谢 Kolink 的格式化

标签: javascript combinations


【解决方案1】:

您可以计算每个子数组的笛卡尔积。见this question and its answer

我试过了,因为它超出了每个数组的长度,所以无论每个列表中有多少元素,它都应该可以工作,并返回每个产品的列表。

【讨论】:

  • 它似乎有效,但为什么:arr4=[['4','4A','4B'],['16D','15D'],['5d','5e' ]]; alert(product(arr4); 不工作但 alert(product(['4','4A','4B'],['16D','15D'],['5d','5e']) ; 有效。有什么建议吗?谢谢
  • 我假设它不需要数组数组,而是需要数组的“列表”。
【解决方案2】:
var arr4 = [['4','4A','4B'],['16D','15D'],['5d','5e']];
for(var a = 0; a < arr4[1].length; a++){
    if(a != 0){
        document.write('<br /><br />');
    }
    for(var b = 0; b < arr4[0].length; b++){
        for(var c = 0; c < arr4[2].length; c++){
            document.write(arr4[0][b] + '-' + arr4[1][a] + '-' + arr4[2][c] + '<br />')
        }
    }
}

显然你不想使用 document.write 但在最后一个 for 循环中是每行输出将使用的地方

arr4[0][b] + '-' + arr4[1][a] + '-' + arr4[2][b]

jsFiddle 对于那些感兴趣的人http://jsfiddle.net/5AmMU/1/

【讨论】:

  • 非常感谢您的解决方案,它按预期工作。但这就是我卡住的地方。 arr4 不是固定数组。它填充了随机生成的数据。在不同的初始化上,它可能如下 [['4','4A','4B'],['16D','15D'],['5d','5e'],['6d','8d '],['9g','9h',['9i']]);或 [['4','4A','4B'],['16D','15D'])]。
  • 如果你写 'a' 代表 arr4[0],b 代表 arr4[1],c 代表 arr4[2],那就没问题了。但是您希望它们以特定的顺序写入,当它是动态填充的数组时,您如何知道您希望它们写入的顺序?
猜你喜欢
  • 1970-01-01
  • 2013-10-06
  • 1970-01-01
  • 1970-01-01
  • 2022-01-23
  • 1970-01-01
  • 2018-05-05
  • 2011-05-16
相关资源
最近更新 更多