2012-06-07 10 views
52

Was ist der schnellste/beste Weg, zwei Arrays zu vergleichen und den Unterschied zurückzugeben? Ähnlich wie array_diff in PHP. Gibt es eine einfache Funktion oder muss ich eine über each() erstellen? oder eine foreach Schleife?Vergleiche 2 Arrays, die den Unterschied zurückgeben

+0

Hiya Mann, ich schätze, Sie können 'inArray' verwenden und den Unterschied zwischen 2 Arrays bevölkern; Ich habe eine funktionierende Demo für Sie eingefügt, hoffe es hilft B-) –

+0

Duplikat von http://stackoverflow.com/questions/1187518/javascript-array-difference (auch wenn es schon woanders irgendwo drin verlinkt wurde) – cregox

+0

Sie wahrscheinlich wollen [diese Antwort aus einer früheren SO-Frage] (http://stackoverflow.com/a/4026828/304588). Es baut auf dem Array-Prototyp auf. –

Antwort

60

Arbeiten Demohttp://jsfiddle.net/u9xES/

Gute Link (JQuery Dokumentation): http://docs.jquery.com/Main_Page {Sie können APIs hier suchen oder lesen}

Hope this Ihnen helfen, wenn Sie es in JQuery zu tun suchen, um.

Die Warnung am Ende fordert das Array von ungewöhnlichen Element Array, d. H. Differenz zwischen 2 Array.

Bitte lemme wissen, wenn ich etwas verpasst habe, Prost!

-Code

var array1 = [1, 2, 3, 4, 5, 6]; 
var array2 = [1, 2, 3, 4, 5, 6, 7, 8, 9]; 
var difference = []; 

jQuery.grep(array2, function(el) { 
     if (jQuery.inArray(el, array1) == -1) difference.push(el); 
}); 

alert(" the difference is " + difference);​ // Changed variable name 
+8

Diese Methode ist cool, sollte aber den Fall berücksichtigen, wenn die Länge von Array2 kleiner ist als array1 –

+14

Eleganter: einfach 'difference = $ .grep (a1, Funktion (x) {return $ .inArray (x, a2) <0}) ' –

+2

Große Antwort. Ich möchte jedoch darauf hinweisen, dass Sie '.grep' wie '.each' verwenden; sollte sein: "difference = $ .grep (array2, funktion (el) {return $ .inArray (el, array1) == -1;})' – PeterKA

1

Array-Operationen wie diese sind nicht der stärkste Punkt von jQuery. Sie sollten eine Bibliothek wie Underscorejs, insbesondere die Differenzfunktion, in Betracht ziehen.

3
var arrayDiff = function (firstArr, secondArr) { 
    var i, o = [], fLen = firstArr.length, sLen = secondArr.length, len; 


    if (fLen > sLen) { 
     len = sLen; 
    } else if (fLen < sLen) { 
     len = fLen; 
    } else { 
     len = sLen; 
    } 
    for (i=0; i < len; i++) { 
     if (firstArr[i] !== secondArr[i]) { 
      o.push({idx: i, elem1: firstArr[i], elem2: secondArr[i]}); //idx: array index 
     } 
    } 

    if (fLen > sLen) { // first > second 
     for (i=sLen; i< fLen; i++) { 
      o.push({idx: i, 0: firstArr[i], 1: undefined}); 
     } 
    } else if (fLen < sLen) { 
     for (i=fLen; i< sLen; i++) { 
      o.push({idx: i, 0: undefined, 1: secondArr[i]}); 
     } 
    }  

    return o; 
}; 
127

Ich weiß, dass dies eine alte Frage, aber ich dachte, ich würde diesen kleinen Trick teilen.

var diff = $(old_array).not(new_array).get(); 

diff enthält jetzt, was in old_array war, die nicht in new_array

+2

kurz und süß .. genau wie ich es mag .. ich benutzte das mit' $ .merge() ', um Unterschiede in einer bestimmten Reihenfolge zu verketten ... – kingkode

+1

wird das funktionieren, wenn Das Array enthält Objekte? Ich versuche Objekte in zwei Arrays zu vergleichen – Batman

+2

Hier ist ein Szenario. Das funktioniert gut für '$ (['h', 'h', 'h', 'h', 'h']). Nicht ($ ([" a "," a "," a "]))' aber für ein Array wie '$ (['h', 'h', 'h', 'h', 'h'])) nicht ($ ([" a "," a "," a "," h "]))' (ACHTUNG das letzte "h" im Array) gibt ein leeres Array zurück. Der Unterschied wird nicht zurückgegeben. Daher ist es fehlerhaft. –

2

ist, wenn Sie auch die Reihenfolge der Antwort auf vergleichen wollen, können Sie die Antwort auf so etwas wie dies erweitern:

Array.prototype.compareTo = function (array2){ 
    var array1 = this; 
    var difference = []; 
    $.grep(array2, function(el) { 
     if ($.inArray(el, array1) == -1) difference.push(el); 
    }); 
    if(difference.length === 0){ 
     var $i = 0; 
     while($i < array1.length){ 
      if(array1[$i] !== array2[$i]){ 
       return false; 
      } 
      $i++; 
     } 
     return true; 
    } 
    return false; 
} 
2

Auf diese Weise brauchen Sie sich keine Gedanken darüber zu machen, ob das erste Array kleiner als das zweite ist.

var arr1 = [1, 2, 3, 4, 5, 6,10], 
    arr2 = [1, 2, 3, 4, 5, 6, 7, 8, 9]; 

function array_diff(array1, array2){ 
    var difference = $.grep(array1, function(el) { return $.inArray(el,array2) < 0}); 
    return difference.concat($.grep(array2, function(el) { return $.inArray(el,array1) < 0}));; 
} 

console.log(array_diff(arr1, arr2)); 
8

Gebrauch unterstreichen, wie:

_.difference(array1,array2) 
+1

Dies bietet keine Antwort auf die Frage. Um einen Autor zu kritisieren oder um Klärung zu bitten, hinterlasse einen Kommentar unter seinem Beitrag. – AlSki

+2

@AlSki gibt es die Antwort auf die gestellte Frage! vergleicht die beiden Arrays und gibt das Diff zurück. –

+1

@ anurag_29 Die Frage war, wie man es mit jQuery macht, nicht unterstreichen. – reergymerej

2
/** SUBTRACT ARRAYS **/ 
function subtractarrays(array1, array2){ 
    var difference = []; 
    for(var i = 0; i < array1.length; i++) { 
     if($.inArray(array1[i], array2) == -1) { 
        difference.push(array1[i]); 
     } 
    } 

    return difference; 
} 

Sie dann die Funktion überall in Ihrem Code aufrufen können.

var I_like = ["love", "sex", "food"]; 
var she_likes = ["love", "food"]; 

alert("what I like and she does't like is: " + subtractarrays(I_like, she_likes)); //returns "Naughty"! 

Dies funktioniert in allen Fällen und vermeidet die Probleme in den oben genannten Methoden. Ich hoffe, das hilft!

0

Dies sollte mit unsortierten Arrays, doppelten Werten und verschiedenen Ordnungen und Länge funktionieren, während Sie die gefilterten Werte von Array1, Array2 oder beiden erhalten.

function arrayDiff(arr1, arr2) { 
    var diff = {}; 

    diff.arr1 = arr1.filter(function(value) { 
     if (arr2.indexOf(value) === -1) { 
      return value; 
     } 
    }); 

    diff.arr2 = arr2.filter(function(value) { 
     if (arr1.indexOf(value) === -1) { 
      return value; 
     } 
    }); 

    diff.concat = diff.arr1.concat(diff.arr2); 

    return diff; 
}; 

var firstArray = [1,2,3,4]; 
var secondArray = [4,6,1,4]; 

console.log(arrayDiff(firstArray, secondArray)); 
console.log(arrayDiff(firstArray, secondArray).arr1); 
// => [ 2, 3 ] 
console.log(arrayDiff(firstArray, secondArray).concat); 
// => [ 2, 3, 6 ] 
0

Statt ganze Lodash des Ziehens können Sie diese leichte array-diff Open-Source-Komponente verwenden.

Beispiel:

diff([1,2,3], [1,2,3,4,5]) // => [4,5] 

Es funktioniert durch concating die beiden Arrays geleitet und Filterung vals enthalten ist, eine Anordnung zurückkehrt, den Unterschied zwischen den beiden Anordnungen darstellen.

Verwandte Themen