Javascript:比较三个数组

Javascript:比较三个数组,javascript,arrays,loops,for-loop,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 = [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
        }
    }
}
等等

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

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


谢谢

我相信是这样,但至少您可以使用比较数组函数使其更简单,即使它同样慢:

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;
}
函数比较数组(arr1、arr2)
{
如果(arr1.length!=arr2.length)返回false;
对于(变量i=0;i

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

根据您对“相同”的定义,您可以将其转换为字符串并进行比较

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

嗯。。。我会这样做的

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]

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

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
var myArrays=[A,B,C,D,E,F,G],
uniques=[],
散列={};
对于(var i=0;i
如果您只是比较原语数组(比如数字或字符串),则可以比较它们的字符串表示形式

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

假设每个数组中只有数字或文本,因此这可能是一种不通过任何数组循环的可行方法:

(见小提琴)

守则:

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]) )
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];
函数比较器(arrList){
var S='@'+arrList.join('@');
变量re=/(@[^@]+)(@.*)(\1)(@$)/gi
var afterReplace='';var i=0;

虽然(afterReplace!=S&&iI要注意的是,我在别处得到了这个函数,可能是在Stackoverflow上,但我早就忘了在哪里了。我对这个函数很好奇。你能不能把它再刷新一点,这样我就可以看到它的工作环境了?没有JSFIDLE示例?对于一组数组很有效,但是对于多个数组呢?@nrabinowitz我不知道它是如何工作的与列出的任何其他方法不同。即使在您的方法中,它的循环次数与数组的循环次数一样多。唯一的区别是您的方法将它们存储在一个对象中。您的方法还可能进行多次比较(散列部分中的散列),使其接触数组的次数超过现有数组的数量(例如,对于5个数组,它可能会进行8次比较)。在这种情况下,如果我对其进行优化,我只会进行5次比较,甚至4次比较。我只是比较哈希,而不是数组。我的版本是O(n)-对于5个数组,它会在对象查找中产生5个哈希值。也许我遗漏了您的版本的某些内容-我只是不知道您的方法如何获取数组列表并生成唯一数组列表,我认为这是OP想要的。我认为此解决方案不正确;它所做的只是检查第一个数组是否等于所有ot她的,如果是,则返回第一个数组。@Peter这是OP要求的。目标是合并相同的数组。您可以将它们作为字符串进行比较,如果它们相同,则合并没有实际意义。您可以只返回第一个数组。@Joseph-是的,但如果您想要所有唯一的数组(我认为OP会这样做),您需要对序列中的每个数组运行此操作,并与其他数组进行比较。for-in会对对象键进行迭代。它不是for-each循环,您不应该在数组上使用它。@缺少注释非常好,但请尝试解释为什么不应该使用某些内容或提供链接。谢谢。我应该更明确一些。数组哈除了索引属性(您真正关心的属性)和for in之外,ve其他属性也可以对它们进行迭代(除非您的浏览器千方百计保护您不受此影响)。如果有一天您决定使用一个库来更改Array.prototype,如MooTools或prototype,并且突然大量虚假内容开始出现在您的循环中,则这是特别危险的。要迭代数组,您应该使用普通for循环或其中一种迭代方法,如.forEach(如果浏览器/库支持此功能)除了一个场景外,在处理这个问题时仍然存在一些问题。疯狂,我知道,但事实就是这样。你能提供一个工作良好的JSFIDLE示例吗?给你:。我在
for
循环中有一个打字错误-
var I;
应该是
var I=0;
。上面已经纠正了。经过各种测试后,我只想说这是可行的mely很好!为了让JSON.stringify与传统浏览器一起工作,我只需要添加Douglas Crockford的JSON js迷你库。我调用了json2.js文件,一切都很好,特别是在IE 6/7中:如果我能为你的答案添加更多的分数,我会的!谢谢:)很高兴这对您有用!
JSON.stringify
可能是这里可用的最好的散列函数,但是如果您知道数组只包含数字或字符串,您可能可以使用一个简单的
.toString()