exemple:
var arr = ["one","two","three"];
arr.forEach(function(part){
part = "four";
return "four";
})
alert(arr);
Le tableau est toujours avec ses valeurs d'origine, existe-t-il un moyen d'avoir accès en écriture aux éléments du tableau à partir de la fonction d'itération?
x=[2,3,4]; x=x.map(n=>n*2); // [4,6,8]
Réponses:
Le rappel est passé l'élément, l'index et le tableau lui-même.
edit - comme indiqué dans un commentaire, la
.forEach()
fonction peut prendre un deuxième argument, qui sera utilisé comme valeur dethis
dans chaque appel au rappel:Ce deuxième exemple montre qu'il
arr
est configuré commethis
dans le rappel. On pourrait penser que le tableau impliqué dans l'.forEach()
appel pourrait être la valeur par défaut dethis
, mais pour une raison quelconque, ce n'est pas le cas;this
seraundefined
si ce deuxième argument n'est pas fourni.(Remarque: les informations ci-dessus
this
ne s'appliquent pas si le rappel est une=>
fonction, car ilthis
n'est jamais lié à rien lorsque de telles fonctions sont appelées.)Il est également important de se rappeler qu'il existe toute une famille d'utilitaires similaires fournis sur le prototype Array, et de nombreuses questions surgissent sur Stackoverflow à propos d'une fonction ou d'une autre, de sorte que la meilleure solution est de simplement choisir un outil différent. Tu as:
forEach
pour faire quelque chose avec ou à chaque entrée d'un tableau;filter
pour produire un nouveau tableau contenant uniquement des entrées éligibles;map
pour créer un nouveau tableau un-à-un en transformant un tableau existant;some
pour vérifier si au moins un élément d'un tableau correspond à une description;every
pour vérifier si toutes les entrées d'un tableau correspondent à une description;find
rechercher une valeur dans un tableauetc. Lien MDN
la source
part
(ou mêmeo
dans es6) n'est pas défini? comment obtenir une valeur itérative?part
seraitundefined
si un élément du tableau a été assignéundefined
explicitement. Les emplacements "vides" d'un tableau (une entrée de tableau à laquelle aucune valeur n'a été affectée) sont ignorés par la.forEach()
plupart des autres méthodes d'itération du tableau..forEach()
prend également un deuxième argumentthisArg
, que vous pouvez utiliser commethis
dans le rappel. REMARQUE: ceci est un argument de.forEach
NOT un argument du rappel.this
second argument passé à.forEach()
, vous devez passer la fonction de rappel à l'aide de la syntaxefunction()
, car l'utilisation de la fonction flèche d'ES6() => {}
ne lie pas le contexte.Allons essayer de rester simple et de discuter la façon dont il fonctionne réellement. Cela concerne les types de variables et les paramètres de fonction.
Voici votre code dont nous parlons:
Tout d'abord, voici où vous devriez lire sur Array.prototype.forEach ():
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach
Deuxièmement, parlons brièvement des types de valeur en JavaScript.
Les primitives (non définies, null, String, Boolean, Number) stockent une valeur réelle.
ex:
var x = 5;
Les types de référence (objets personnalisés) stockent l'emplacement mémoire de l'objet.
ex:
var xObj = { x : 5 };
Et troisièmement, comment fonctionnent les paramètres de fonction.
Dans les fonctions, les paramètres sont toujours passés par valeur.
Parce qu'il
arr
s'agit d'un tableau de chaînes, c'est un tableau d' objets primitifs , ce qui signifie qu'ils sont stockés par valeur.Donc, pour votre code ci-dessus, cela signifie que chaque fois que forEach () itère,
part
est égal à la même valeur quearr[index]
, mais pas au même objet .part = "four";
changera lapart
variable, mais laisseraarr
tranquille.Le code suivant changera les valeurs que vous désirez:
Maintenant, si le tableau
arr
était un tableau de types de référence , le code suivant fonctionnera car les types de référence stockent un emplacement de mémoire d'un objet au lieu de l'objet réel.Ce qui suit illustre que vous pouvez modifier
part
pour pointer vers un nouvel objet tout en laissant les objets stockésarr
seuls:la source
In functions, parameters are always passed by value.
qu'en est-il du deuxième exemple?Tableau:
[1, 2, 3, 4]
Résultat:
["foo1", "foo2", "foo3", "foo4"]
Array.prototype.map()
Conserver le tableau d'origineArray.prototype.forEach()
Remplacer la matrice d'originela source
let arr1 = ["1", 2, 3, 4]; arr1.map(function(v) { return "foo"+ v; }); console.log( arr );
Array.prototype.map () Ne jamais modifier le tableau d'origine, forEach mutate.map
peut définitivement muter son tableau etforEach
, en général, ne le fait pas.Javascript est passé par valeur, ce qui signifie essentiellement
part
une copie de la valeur dans le tableau.Pour modifier la valeur, accédez au tableau lui-même dans votre boucle.
arr[index] = 'new value';
la source
part
copie - bien que vous ayez raison de dire que la variable n'est pas un pointeur, mais une valeurremplacez-le par l'index du tableau.
la source
Voici une réponse similaire en utilisant une
=>
fonction de style:donne le résultat:
Le
self
paramètre n'est pas strictement nécessaire avec la fonction de style de flèche, doncfonctionne également.
la source
La fonction .forEach peut avoir une fonction de rappel (eachelement, elementIndex) Donc, fondamentalement, ce que vous devez faire est:
Ou si vous souhaitez conserver le tableau d'origine, vous pouvez en faire une copie avant d'effectuer le processus ci-dessus. Pour faire une copie, vous pouvez utiliser:
la source
map()
place deforEach()
.map()
parcourt le tableau source et retourne un nouveau tableau contenant la copie [modifiée] de l'original: le tableau source reste inchangé.Avec les méthodes d'objets Array, vous pouvez encore modifier le contenu du tableau par rapport aux boucles de base pour, ces méthodes manquent d'une fonctionnalité importante. Vous ne pouvez pas modifier l'index lors de l'exécution.
Par exemple, si vous supprimez l'élément actuel et le placez à une autre position d'index dans le même tableau, vous pouvez facilement le faire. Si vous déplacez l'élément actuel vers une position précédente, il n'y a aucun problème dans la prochaine itération, vous obtiendrez le même élément suivant que si vous n'aviez rien fait.
Considérez ce code où nous déplaçons l'élément à la position d'index 5 à la position d'index 2 une fois que l'index compte jusqu'à 5.
Cependant, si nous déplaçons l'élément actuel quelque part au-delà de la position d'index actuelle, les choses deviennent un peu compliquées. Ensuite, l'élément très suivant se déplacera dans la position des éléments déplacés et dans la prochaine itération, nous ne serons pas en mesure de le voir ou de l'évaluer.
Considérez ce code où nous déplaçons l'élément à la position d'index 5 à la position d'index 7 une fois que l'index compte jusqu'à 5.
Nous n'avons donc jamais rencontré 6 dans la boucle. Normalement, dans une boucle for, vous devez diminuer la valeur d'index lorsque vous déplacez l'élément de tableau vers l'avant afin que votre index reste à la même position lors de la prochaine exécution et que vous puissiez toujours évaluer l'élément déplacé à la place de l'élément supprimé. Cela n'est pas possible avec les méthodes de tableau. Vous ne pouvez pas modifier l'index. Vérifiez le code suivant
Comme vous le voyez quand on décrémente
i
cela ne continuera pas de 5 mais 6, d'où il était parti.Gardez cela à l'esprit.
la source
Pour ajouter ou supprimer entièrement des éléments qui modifieraient l'index, par extension de la suggestion zhujy_8833 de slice () pour itérer sur une copie, il suffit de compter le nombre d'éléments que vous avez déjà supprimés ou ajoutés et de modifier l'index en conséquence. Par exemple, pour supprimer des éléments:
Pour insérer des éléments avant:
Pour insérer des éléments après:
Pour remplacer un élément:
Remarque: si vous implémentez à la fois des insertions «avant» et «après», le code doit d'abord gérer les insertions «avant», l'inverse ne serait pas comme prévu
la source
Vous pouvez essayer ceci si vous souhaitez remplacer
la source