Javascript:比较三个数组

时间:2011-10-07 23:34:52

标签: javascript arrays loops for-loop

我想比较许多数组并组合任何相同的数组:

A = [1,2,3];
B = [1,2,3];
C = [1,2,3];

D = [10,11,12];
E = [10,11,12];
F = [10,11,12];

G = [13,14];
H = [13,14];

如果有相同的数组,那么我想用相同的数组创建新数组:

I = [1,2,3];
J = [10,11,12];
K = [13,14];

我是否需要针对其他数组中的所有元素迭代一个数组中的每个元素?

for (var i in A) {
    for (var j in B) {
        if (A[i] == J[j]) {
            // create new arrays
        }
    }
}

等...

然后,从匹配中创建新数组?听起来很开销。

实现这一目标的最佳方法是什么?

谢谢!

6 个答案:

答案 0 :(得分:5)

如果您只想尝试使用唯一数组,我会使用哈希方法:

var myArrays = [A,B,C,D,E,F,G],
    uniques = [],
    hashes = {};

for (var i=0; i < myArrays.length; i++) {
    var hash = JSON.stringify(myArrays[i]); // or .toString(), or whatever
    if (!(hash in hashes)) {
        hashes[hash] = true;
        uniques.push(myArrays[i]);
    }
}
// uniques now holds all unique arrays

答案 1 :(得分:1)

根据您对相同内容的定义,您只需转换为字符串并进行比较即可。

if (A.toString() == B.toString()) { //combine }

答案 2 :(得分:1)

嗯......我会这样做的

function combine(arr1, arr2)
{
    if(arr1.join(',') === arr2.join(','))
        return arr1;
}

或许多数组

function combine(arrList)
{
    var pass = true;
    var compareArray = arrList[0];
    for(var i in arrList)
        pass = pass && (arrList[i].join(',') === compareArray.join(','));
    if(pass)
        return compareArray;
}

arr = combine([[1,2,3],[1,2,3],[1,2,3]]); // results in [1,2,3]

答案 3 :(得分:1)

如果你只是比较基元的数组 - 数字或字符串,比如说 - 你可以比较它们的字符串表示。

function simpleArrayMatch(A,B){
    return String{A)===String(B);
}

答案 4 :(得分:1)

假设每个数组中的所有内容都只是数字或文本,所以这可能是一种可行的方法,而不会遍历任何数组:

(参见小提琴here

代码:

A = [1,2,3];
B = [1,2,3];
C = [1,2,3];

D = [10,11,12];
E = [10,11,12];
F = [10,11,12];

G = [13,14];
H = [13,14];

function compareArr(arrList){
    var S = '@' + arrList.join('@');
    var re = /(@[^@]+)(@.*)?(\1)(@|$)/gi
    var afterReplace=''; var i=0;
    while(afterReplace!=S && i<100){
        afterReplace=S;
        S = S.replace( re, "$1$2$4" )
        i++
    }

    return S.substr(1,S.length-1).replace(/@/g,'<br>')
}

$('html').append( compareArr([A,B,C,D,E,F,G,H]) )

策略是将所有数组连接成一个字符串,并以“@”作为分隔符。然后使用正则表达式替换字符串中的所有重复片段,最后拆分字符串,然后列出唯一的列表。

在我的代码中使用while循环的原因只是因为我无法编写更好的正则表达式模式来立即删除重复的部分。寻找更好的正则表达式?

答案 5 :(得分:0)

我相信,但至少你可以使用比较数组函数来使它更容易,即使它同样慢:

function compareArrays(arr1,arr2)
{
    if (arr1.length != arr2.length) return false;
    for (var i = 0; i < arr2.length; i++) 
    {
        if (arr1[i].compareArrays) 
        { //likely nested arr2ay
            if (!arr1[i].compareArrays(arr2[i])) return false;
            else continue;
        }
        if (arr1[i] != arr2[i]) return false;
    }
    return true;
}

然后,您只需要在遍历数组时使用此函数。