95 votes

Que fait .map() dans cette situation ?

En utilisant la console Chrome, voici mes entrées et sorties :

[0].map(Array);

[[0, 0, [0]]]; // output

Qu'est-ce qui se passe ici ?

EDIT

La raison pour laquelle cela me rend curieux est que quelque chose comme

[0].map(String);

Reviendra

["0"];

Et pas

["0", "0", "String"]

34 votes

Je suppose qu'il a toujours besoin de Javascript WTF pour se sentir heureux.

12 votes

Oh, c'est juste une variante moins wtf-y de ['10', '10', '10'].map(parseInt)

2 votes

Un autre étrange .map() comportement : stackoverflow.com/questions/14528397/ En général, il faut être prudent lorsque l'on utilise .map() avec des fonctions qui prennent plus d'un argument.

123voto

nnnnnn Points 70578

Le site .map() función appelle le Array() avec trois arguments, la valeur de l'élément du tableau qui est 0 l'indice de cet élément, également 0 et une référence à l'ensemble du tableau.

Donc c'est comme faire ça :

var a = [0];
var index = 0
Array(a[index], index, a);   // create array with three elements

Le tableau retourné par Array() devient alors le premier élément du tableau que .map() crée, d'où le niveau supplémentaire d'imbrication dans vos [[0, 0, [0]]] résultat.

EDIT concernant votre édition : quand vous dites [0].map(String); qui se traduit par String() étant appelé avec les trois mêmes arguments que String(a[index], index, a) mais le String() ignore tout sauf le premier argument, alors que la fonction Array() utilise tous les arguments fournis.

39voto

ibrahim mahrir Points 22237

Tout d'abord , Array pourrait être utilisé comme une fonction pour créer des tableaux :

var arr = Array(1, 2, "Hello");

console.log(arr); // [1, 2, "Hello"]

Ensuite, , map passe trois paramètres à sa fonction de rappel : l'élément, son index dans le tableau et le tableau lui-même.

Alors puisque votre tableau contient un élément, la ligne :

[0].map(Array);

est équivalent à :

[Array(0, 0, [0])];     // the element 0 in the original array will be mapped into Array(0, 0, [0])

6voto

Après avoir mis à jour la question. Les autres réponses vous fournissent des informations sur carte

Pour répondre à la question de savoir pourquoi les tableaux et les chaînes de caractères diffèrent, regardez les constructeurs.

Le constructeur de chaîne accepte 1 paramètre String(thing) while array nouveau tableau (élément0, élément1[, ...[, élémentN]])

2 votes

C'est la même raison pour laquelle .map(Number) convertit chaque élément en un nombre plutôt que de retourner quelque chose comme [3, 2, [4, 1, 3]] pour chaque article.

0 votes

@Xufox oui la réponse est dans les constructeurs :)

4voto

Mariusz Pawelski Points 857

Cet appel

[0].map(Array);

vous donne le même résultat que si vous aviez écrit quelque chose comme ceci :

[0].map(function (value, index, array) {
    return Array(value, index, array);
})

Carte appelle la fonction Array avec trois paramètres : la valeur de l'élément, l'index de l'élément et le tableau entier. Cet appel à Array retourne un tableau avec 3 éléments : valeur (nombre) 0 ), indice (nombre 0 ), tableau entier ( [0] ).

Et ce nouveau tableau est enveloppé dans le tableau original, parce que vous avez mappé l'élément original (numéro 0 ) au nouvel élément (tableau de 3 éléments)

Remarque : vous avez peut-être l'habitude de n'utiliser que le premier paramètre, comme dans l'exemple ci-dessous.

array.map(function (a) { return a * a; });

ou en utilisant seulement deux pour obtenir également l'indice

array.map(function (item, index) { return "index=" + index + ", value=" + item; });

Mais vous devez vous rappeler que map fournit toujours 3 paramètres, il suffit de les ignorer dans votre fonction de rappel. C'est aussi la raison pour laquelle un code comme :

[0].map(String);

renvoie à

["0"]

C'est parce que Chaîne de caractères ne s'intéresse qu'au premier paramètre et ignore les autres paramètres passés. Si vous appelez

String(11, "Some", "other", "ignored", "parameters")

vous obtiendrez toujours

"11"

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X