2017-10-18 4 views
0

Ich habe gerade angefangen, Java-Skript zu lernen und das Konzept der filter() - Funktion ist für mich verwirrend.Verwirrt an der Filter() -Funktion und ich brauche eine eingehende Erklärung

a.filter(function(item, pos) { 
    return a.indexOf(item) == pos; 
}) 

Oben ist ein Code-Schnipsel, wo die Filterfunktion ohne Duplikate ein Array zeigt, lässt vermuten, a ist ein Array mit vielen doppelten Nummern.

I 100% verstehe nicht, was im Block des Codes vor sich geht. Ich weiß, dass die Filterfunktion einen booleschen Wert zurückgibt, aber was bedeutet item in dieser Gleichung? Was bedeutet pos? Wenn die Filterfunktion einen booleschen Wert zurückgibt, warum gibt diese Gleichung ein Array von Zahlen zurück, die nicht doppelt sind?

+3

Haben Sie die Dokumentation der 'Filter'-Funktion gelesen? https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter Es erklärt, was die Argumente für die Callback-Funktion sind. – Barmar

+1

Der Filter gibt keinen booleschen Wert zurück, sondern gibt ein gefiltertes Array zurück. Wenn der Callback "true" zurückgibt, wird item im Ergebnis enthalten, wenn false nicht. In diesem Fall ist das Prädikat - ist der aktuelle Index des Elements ('pos') der gleiche wie der Index des Elements im Array. Wenn nicht, ist das Objekt ein Duplikat und wir werden herausgefiltert. Lesen Sie etwas über [Array # filter] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter). –

Antwort

1

filter gibt keinen booleschen Wert zurück, sondern gibt ein Array zurück, das Elemente des ursprünglichen Arrays enthält. Er entscheidet, welche Elemente in das Ergebnis aufgenommen werden sollen, indem er eine Funktion aufruft, die Sie für jedes Element des Arrays bereitstellen. Diese Funktion gibt einen booleschen Wert zurück: Wenn es truthy ist, wird dieses Element im Ergebnis enthalten. Die Argumente für die Funktion sind das Element (in Ihrer Funktion item genannt) und seine Position im Array (pos).

Diese Funktion verwendet indexOf(), um die Position des ersten Elements im Array zu finden, das denselben Wert wie das Element hat, dem es zugewiesen wurde. Wenn diese Position mit der Position identisch ist, an der sie angegeben wurde, muss dieses Element das erste Vorkommen dieses Werts im Array sein. Daher gibt es true zurück und das Element wird im Ergebnis enthalten sein. Wenn die Positionen unterschiedlich sind, muss dieses Element ein späteres Duplikat sein, sodass es false zurückgibt und das Element nicht im Ergebnis enthalten ist. Das Endergebnis davon ist, dass nur die erste Kopie jedes Wertes in der resultierenden Filterung enthalten ist, was bedeutet, dass sie alle einzigartig sind.

Zum Beispiel: Angenommen das Array:

["a", "b", "a", "c"] 

Auf der ersten Iteration item = "a" und pos = 0. a.indexOf(item) gibt 0 zurück, und die Funktion gibt 0 == 0 zurück, das true ist, so dass item im Ergebnis enthalten ist.

In der zweiten Iteration item = "b" und pos = 1. a.indexOf(item) gibt 1 zurück, und die Funktion gibt 1 == 1 zurück, das true ist, so dass item im Ergebnis enthalten ist.

In der dritten Iteration item == "a" und pos = 2. a.indexOf(item) gibt 0 zurück, und die Funktion gibt 0 == 2 zurück, also false, also item ist nicht im Ergebnis enthalten.

Auf der vierten Iteration, item = "c" und pos = 3. a.indexOf(item) gibt 3 zurück, und die Funktion gibt 3 == 3 zurück, das true ist, so dass item im Ergebnis enthalten ist.

Das Endergebnis ist, dass die Elemente der ersten, zweiten und vierten Iteration im Ergebnis enthalten sind, also ["a", "b", "c"].

+0

Bedeutet das, dass "pos" als ein Index für jedes Element in dem Array entspricht? Nehmen wir an, das Array befindet sich auf "[1, 2, 1, 3]" und ich filtere das Array mit der gleichen Funktionssyntax wie oben gezeigt. Bedeutet es für die erste Iteration, dass die übergebenen Argumente 'function (1, 0)' sind? Wenn die Iteration erneut durchlaufen wird, wäre dies "Funktion (2, 1)". "2" bedeutet das Element und "1" den Index. Aber wäre die 3. Iteration nicht 'function (1, 2)'? Ich muss es nur so einfach wie möglich brechen. – Ken

+0

Ich habe ein vollständiges Beispiel von 4 Iterationen hinzugefügt. – Barmar

+0

Vielen Dank für die ausführliche Erklärung! Sie sind ein Gelehrter und ein Gentleman! – Ken

0

Der Filter 'Callback' Parameter gibt ein 'Boolean' zurück; Die Filterfunktion gibt das gefilterte Array zurück.

Verwandte Themen