6
votes

foreach sur un "nouveau tableau" ne fait pas ce que j'attends

Je vais juste apprendre à utiliser les fonctions JS High-Order (carte, foreseach, réduire, etc.) et avoir trébuché dans la confusion. J'essaie d'écrire une fonction de «gamme» simple, mais je ne peux pas sembler peupler mon réseau de sortie. C'est l'objectif: xxx

Je reçois cela: xxx

voici mon code: xxx

Qu'est-ce que je manque ici? Pour autant que je puisse dire que le problème semble avoir quelque chose à voir avec la façon dont j'utilise «nouveau tableau», mais au-delà de cela, je suis perdu.

Oh, et voici la partie qui confond vraiment moi. Cela fonctionne bien: xxx

merci !!


6 commentaires

Ne pensez pas que vous avez besoin »(num2 + 1) - Num1)", puisque JavaScript utilise des matrices dynamiques.


@Serdnad Ce n'est pas nécessaire, mais il construit un tableau vide de cette longueur: tableau (4) = [non défini x 4]


Notez sur l'utilisation de .map () qui n'est pas lié à votre problème: Dans votre rappel, il n'y a pas besoin d'avoir retour arr [i] = num1 + i , vous pouvez Dites simplement retour num1 + i; . Il n'y a aucun point de réglage des valeurs dans Art - qui est le même tableau que rangearr - parce que mappe construit un nouveau tableau et c'est ce que vous êtes retour de votre plage () fonction.


@Serdnad signifie-t-il que je pouvais simplement avoir déclaré un tableau vide?


@i_made_tha bien, vous pourriez avoir. JavaScript utilise des matrices dynamiques, de sorte que cela augmentera si besoin d'être. Bien sûr, vous sacrifiez un peu de performance, mais il est parfois plus pratique, si vous n'êtes pas sûr de la taille de votre matrice dont vous avez besoin et que vous ne voulez pas commencer par un matrice massif pour compenser. Comme Cincodenada a clarifié cependant, pas nécessaire.


étroitement lié: JavaScript nouveau tableau (n) et array.pototype.map étrangeté


4 Réponses :


0
votes

Le problème est que mappe code> ne pas itérer des entrées non définies (*).

i suggère d'utiliser un pour code> boucle à la place: p>

var rangeArr = new Array((num2 + 1) - num1);
for(var i=0; i<=num2-num1; ++i)
    rangeArr[i] = num1 + i;
return rangeArr;


5 commentaires

[indéfini, indéfini, non défini] .map () itération réellement


@Cristimihai je voulais dire ce type de non défini: []. Mappe ()


Je comprends que .map () n'est pas censé itérer sur des index qui n'ont jamais été attribués de valeurs, mais pourquoi le code de l'OP renvoie-t-il un tableau avec quatre éléments indéfinis de celui-ci et un .Length de 4?


@nnnnnn parce que le tableau retourné est créé à l'aide de Nouveau tableau (LEN) (voir SPEC ), où len est la longueur de la matrice initiale.


Ah. Donc, .map () retournera toujours une matrice de la même longueur que le tableau qu'il a été appelé, même s'il ne peut pas appeler le rappel de certains éléments?



1
votes

Le tableau est défini avec 4 entiers dont chacun est indéfini.

carte ne va pas itérair sur des intérêts non définis, il les saute.

rappel est invoqué uniquement pour les index de la matrice qui ont affecté valeurs; il n'est pas invoqué pour les index indéfinis, ceux qui ont été supprimés ou qui n'ont jamais été attribués de valeurs.

https: //developer.mozilla. Org / fr-nous / docs / Web / JavaScript / Référence / Global_Objects / Array / Carte


0 commentaires

1
votes

Lorsque vous créez un nouveau tableau (x) il crée ce qu'on appelle un tableau grave , ce qui pourrait se comporter un peu différemment, comme vous pouvez le constater, des navigateurs Dirons [non défini x 20, "foo", non défini x 5] Si vous venez de définir une seule valeur, et je crois que cela n'hétère pas sur ces valeurs.


1 commentaires

Pas sûr que je suive assez. Voulez-vous dire si j'étais ajouté cela sous le var rangearr Déclaration: rangearr [0] = num1 ?



4
votes

La méthode foreach itère sur les indices du tableau . Il est intéressant de noter que lorsque vous créez un nouveau tableau via nouveau tableau (n) , il contient aucun indice du tout . Au lieu de cela, il vient de définir sa propriété .Longueur . XXX

MDN décrit foreach , et spécifiquement états:

foreach exécute le rappel fourni une fois pour chaque élément de la tableau avec une valeur attribuée. Il est non invoqué pour les index qui ont été supprimé ou élu .

Voici une technique soignée pour obtenir un tableau avec des index vides, mais existants, mais existants. xxx

ceci fonctionne car .Apply "élargit" les éléments élus dans des arguments appropriés et les résultats finissent par être quelque chose comme tableau (indéfini, non défini, indéfini) .


3 commentaires

Très cool, travaillé comme un charme !!! Acceptera votre réponse en T-moins 4 minutes et comptera;)


Hors de curiosité, toute idée de savoir pourquoi voudrait-on un tableau sans index? Est-ce que cela ne vainne pas le but?


@I_Made_That: Je ne peux pas vraiment penser à un cas d'utilisation pour cela. Il me semble être juste une autre barnacle compatible avec l'API standard de JavaScript. :]