2017-10-18 61 views
0

Je viens de commencer à apprendre le script java et le concept de la fonction filter() est confus pour moi.Confus à la fonction filter() et j'ai besoin d'une explication en profondeur

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

est supérieur à un extrait de code où la fonction de filtre affiche un tableau sans doublons, laisse supposer a est un tableau avec beaucoup de numéros en double.

I 100% ne comprend pas ce qui se passe dans le bloc de code. Je sais que la fonction de filtre renvoie une valeur booléenne, mais que signifie item dans cette équation? Que signifie pos? Si la fonction de filtre renvoie une valeur booléenne, pourquoi cette équation retourne-t-elle un tableau de nombres qui ne sont pas en double?

+3

Avez-vous lu la documentation de la fonction 'filter'? https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter Il explique quels sont les arguments de la fonction de rappel. – Barmar

+1

Le filtre ne retourne pas un booléen, il renvoie un tableau filtré. Si le callback renvoie 'true', alors item est inclus dans le résultat, sinon false. Dans ce cas, le prédicat est - est-ce que l'index actuel de l'élément ('pos') est le même que l'index de l'élément dans le tableau. Sinon, l'élément est un doublon, et nous serons filtrés. Lisez un peu à propos de [Array # filter] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter). –

Répondre

1

filter ne retourne pas un booléen, il renvoie un tableau contenant des éléments du tableau d'origine. Il décide quels éléments inclure dans le résultat en appelant une fonction que vous fournissez sur chaque élément du tableau. Cette fonction retourne un booléen: si c'est vrai, cet élément est inclus dans le résultat. Les arguments de la fonction sont l'élément (appelé item dans votre fonction) et sa position dans le tableau (appelé pos).

Cette fonction utilise indexOf() pour trouver la position du premier élément du tableau qui a la même valeur que l'élément qui lui a été donné. Si cette position est la même que la position qui lui a été donnée, alors cet élément doit être la première occurrence de cette valeur dans le tableau, donc il retourne true et l'élément sera inclus dans le résultat. Si les positions sont différentes, cet élément doit être un doublon plus tard, de sorte qu'il renvoie false et l'élément n'est pas inclus dans le résultat. Le résultat final est que seule la première copie de chaque valeur est incluse dans le résultat du filtrage, ce qui signifie qu'ils sont tous uniques.

Par exemple, supposons que le tableau est:

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

Sur la première itération, item = "a" et pos = 0. a.indexOf(item) renvoie 0, et la fonction renvoie 0 == 0, qui est true, donc item est inclus dans le résultat. Sur la deuxième itération, item = "b" et pos = 1. a.indexOf(item) renvoie 1 et la fonction renvoie 1 == 1, qui correspond à true, de sorte que item est inclus dans le résultat. Pour la troisième itération, item == "a" et pos = 2. a.indexOf(item) renvoie 0 et la fonction renvoie 0 == 2, qui est false, donc item est et non inclus dans le résultat. Sur la quatrième itération, item = "c" et pos = 3. a.indexOf(item) renvoie 3, et la fonction renvoie 3 == 3, qui est true, donc item est inclus dans le résultat.

Le résultat final est que les éléments des première, deuxième et quatrième itérations sont inclus dans le résultat, qui est ["a", "b", "c"].

+0

Cela signifie-t-il que 'pos' correspond à un index de chaque élément du tableau? Disons donc que le tableau est '[1, 2, 1, 3]' et je filtre le tableau avec la même syntaxe de fonction que celle montrée ci-dessus. Cela signifie-t-il que pour la première itération, les arguments passés seront 'function (1, 0)'? Quand l'itération passe à nouveau, ce serait 'function (2, 1)'. '2' signifiant l'élément et' 1' signifiant l'index. Mais la troisième itération ne serait-elle pas 'fonction (1, 2)'? J'ai juste besoin de le décomposer aussi simple que possible. – Ken

+0

J'ai ajouté un exemple complet de 4 itérations. – Barmar

+0

Merci pour l'explication en profondeur! Vous êtes un érudit et un gentleman! – Ken

0

Le paramètre 'callback' du filtre renvoie un 'Boolean'; La fonction de filtre renvoie le tableau filtré.