0

我想保存数组的所有组合。所以对于 [a, b, c] 我想保存 [ab, ac, ba, bc, ca, cb]

我目前使用这种方法:

for (coordinate in coordinates){
    for (coordinate2 in coordinates){
        if (coordinate != coordinate2){
            newposts.push([fbposts[fbpost].id, coordinates[coordinate], coordinates[coordinate2]]);
        }
    }
}

但它会产生一堆重复。解决这个问题最顺利的方法是什么?

4

3 回答 3

1

您可以利用您只能定义一次属性并具有以下内容的事实:

$(function() {
    var arr = ["a","b","c"];
    var permutations ={};
    $.each(arr, function(index1, val1) 
    {
        $.each(arr, function(index2, val2) 
        {
            permutations[val1+val2] = 0;
        });      

    });
    for(var prop in permutations)
    {
        //in prop you will have your elements: aa,ab...

    }        

});​

在这种情况下,排列将扮演字典的角色

生成组合的逻辑是次优的,因为运行时间是 n 平方 -有关从 n 元素数组中生成 k 元素组合的算法,请参阅此问题

于 2012-07-15T11:50:01.490 回答
1

在通过自定义函数或可能添加到新数组之前添加检查

array.indexOf(...)

类似于 jQuery 的自定义函数:

function inArray(needle, haystack) {
    var length = haystack.length;
    for(var i = 0; i < length; i++) {
        if(haystack[i] == needle) return true;
    }
    return false;
}

因此,当您正在构建新的排列/组合数组时(自我上一次统计课以来已经 13 年以上),请执行快速检查,如果为真则不要添加,否则添加。我相信如果您执行数组合并,它会执行类似的相同性能。

于 2012-07-15T11:33:22.277 回答
1

您可以使用修改后的冒泡排序算法:

var result = [],
arr = 'abc'.split('');

// begin the bubble sort loop
for(var i=0,l=arr.length;i<l-1;i++)
    for(var j=i+1;j<l;j++)
        {
            result.push(arr[i]+arr[j]);
            result.push(arr[j]+arr[i]);
        }
console.log(result); //["ab", "ba", "ac", "ca", "bc", "cb"]

通过以这种方式循环数组,您甚至不需要检查结果是否重复,因为它不会生成任何结果。顺便说一句,不要使用for..in合成器循环数组,因为它可能会产生意想不到的结果。

于 2012-07-15T11:39:32.507 回答