2017-04-19 3 views
1

Ich habe eine kurze Frage zum Finden des Unterschieds zwischen zwei Arrays. Ich fand ein Stück JavaScript-Code, der tut, was ich will here und modifiziert es ein wenig:Unterschied von zwei Arrays

JS

function diffArray(arr1, arr2) { 
    var newArr = []; 
    var myArr = arr1.concat(arr2); 

    newArr = myArr.filter(function(item){ 
    return arr2.indexOf(item) < 0 || arr1.indexOf(item) < 0; 
    }); 

    return newArr; 
} 

diffArray([1, 2, 3, 5], [1, 2, 3, 4, 5]); 

aber ich bin mir nicht sicher, dass ich wirklich verstehen, was die Filterfunktion hier tut. Könnte mir jemand eine klare Erklärung geben, wie das funktioniert?

Hinweis: Ich kenne bereits die Grundlagen der Filterfunktionen. Ich suche nach einer genauen Erklärung dieses Filters.

+3

Wenn Element nicht in 'arr2' ist, prüfen Sie, ob es in 'arr1' ist, wenn nicht in 'arr1', geben Sie entweder false zurück, andernfalls geben Sie true zurück. – adeneo

+0

Danke! Das fängt an mehr Sinn zu machen. –

+0

Ich mag keine dummen Codes impliziert "Hey schau ich habe 2 Zeichen weniger getippt". Es hätte wie 'arr2.indexOf (item)> = 0 && arr1.indexOf (item)> = 0; ' – Redu

Antwort

4
newArr = myArr.filter(function(item){ 
    return arr2.indexOf(item) < 0 || arr1.indexOf(item) < 0; 
}); 

Die Array#filter Funktion iteriert über jedes Element des neu hergestellten Array aus concat Funktion (enthaltend jedes Element aus arr1 und arr2 Arrays).

Wenn mindestens eine der Bedingungen arr2.indexOf(item) < 0 oder arr1.indexOf(item) < 0 erfüllt ist (Returns true) irgend Iteration die Funktion Array#filterausfiltert (Returns), die (tatsächlich iteriert) Element angegeben.

Im Fall, wenn das iterative Element ist sowohl in arr1 und arr2, die indexOf Funktion wird der Index zurückkehren (die höher als 0 ist) - die Bedingung false zurückkehren wird (es ist nicht kleiner als 0). Wir erhalten dann false || false, das false ist, und dieses Element wird nicht in das Array newArr aufgenommen, das einzigartige Elemente enthält. wenn gegebenes Element

Im Fall ist nur in einem Array (es ist nicht in dem zweiten nicht vorhanden ist - es ist Index -1 zurückkehren wird - es wird die < 0 Bedingung erfüllen) - eine der Bedingungen werden true zurückkehren, so dass die beide Bedingungen werden true || false, das ist true - gegebenes Element wird im newArr Array enthalten sein.

+1

Danke! Genau das habe ich gesucht. –

0

Filter verwendet ein Lambda, um die Liste zu filtern.

Dies bedeutet im Wesentlichen, dass es den Code zwischen dem {} ausführt und ein Array zurückgibt, das die Kriterien erfüllt. Ihre Kriterien sind, dass der Index des Elements in beiden Arrays größer als 0 ist, was im Wesentlichen bedeutet, dass es in beiden Arrays ist.

können Sie mehr hier lesen: https://www.w3schools.com/jsref/jsref_filter.asp

0

einfache Möglichkeit, dies zu denken, dass Filterfunktion wird intern ein Array zu erstellen. Die Elemente dieses internen Arrays sind diejenigen, die die Bedingung in der Callback-Funktion übergeben. Dies ist möglich, da diese Entscheidung in der Callback-Funktion jeweils einzeln getroffen wird.

Bedingung arr2.indexOf (item) < 0 || arr1.indexOf (item) < 0 passiert nur für Element 4, da zu diesem Zeitpunkt 4 nicht in arr1 vorhanden ist. Da true zurückgegeben wird, wird Element 4 in das interne Array eingefügt. Letztendlich wird 4 in newArr zurückgegeben.