it-swarm.com.de

Vergleichen Sie 2 Arrays, die die Differenz zurückgeben

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

57
Howdy_McGee

Arbeitsdemohttp://jsfiddle.net/u9xES/

Guter Link (Jquery-Dokumentation): http://docs.jquery.com/Main_Page {Hier können Sie APIs suchen oder lesen.}

Hoffen Sie, dass dies Ihnen helfen wird, wenn Sie dies in JQuery tun möchten.

Die Warnung am Ende fordert das Array eines ungewöhnlichen Elementarrays auf, d. H. Die Differenz zwischen zwei Arrays.

Bitte lass mich 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 
64
Tats_innit

Ich weiß, das ist 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 den Inhalt von old_array, der nicht in new_array enthalten ist.

137
superphonic

verwenden Sie Unterstrich als:

_.difference(array1,array2)
8
anurag_29
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;
};
3
user235273
/** 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 können die Funktion dann an beliebiger Stelle in Ihrem Code aufrufen.

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. Hoffentlich hilft das!

3
Kareem

Auf diese Weise müssen Sie sich keine Sorgen machen, wenn 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));
2
Behnam Rasooli

wenn Sie auch die Reihenfolge der Antworten vergleichen möchten, können Sie die Antwort auf Folgendes 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
Dries

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

1
Jonas Høgh

Die Kurzversion kann so aussehen:

const diff = (a, b) => b.filter((i) => a.indexOf(i) === -1);

ergebnis:

diff(['a', 'b'], ['a', 'b', 'c', 'd']);

["c", "d"]
0
Maksym Kalin

Dies sollte mit unsortierten Arrays, doppelten Werten und unterschiedlichen Reihenfolgen und Längen 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
Elvis