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 un accès en écriture aux éléments du tableau à partir d'une fonction itérative?
Le rappel reçoit l'élément, l'index et le tableau lui-même.
arr.forEach(function(part, index, theArray) {
theArray[index] = "hello world";
});
edit - Comme indiqué dans un commentaire, la fonction .forEach()
peut prendre un deuxième argument, qui sera utilisé comme valeur de this
à chaque appel du rappel:
arr.forEach(function(part, index) {
this[index] = "hello world";
}, arr); // use arr as this
Ce deuxième exemple montre que arr
est lui-même configuré en tant que this
dans le rappel. On pourrait penser que le tableau impliqué dans l'appel .forEach()
pourrait être la valeur par défaut de this
, mais pour une raison quelconque, ce ne l'est pas; this
sera undefined
si ce deuxième argument n'est pas fourni.
De plus, il est important de se rappeler qu'il existe toute une famille d'utilitaires similaires fournis sur le prototype Array, et que Stackoverflow pose de nombreuses questions sur l'une ou l'autre fonction, de sorte que la meilleure solution consiste simplement à choisir un outil différent. Tu as:
forEach
pour faire quelque chose avec ou pour chaque entrée d'un tableau;filter
pour produire un nouveau tableau contenant uniquement des entrées qualifiantes;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 entrées dans un tableau correspondent à une description;find
pour rechercher une valeur dans un tableauetc. lien MDN
Tableau: ["1", 2, 3, 4]
Résultat: ["foo1", "foo2", "foo3", "foo4"]
Array.prototype.map()
Conserver la matrice d'origineréalisé en introduisant une nouvelle variable modifiedArr
var arr = ["1", 2, 3, 4];
var modifiedArr = arr.map(function(v) {
return "foo"+ v;
});
console.log( "Original:", arr );
console.log( "Modified:", modifiedArr );
Array.prototype.map()
Modifier le tableau d'origineréalisé en réaffectant la variable arr
var arr = ["1", 2, 3, 4];
arr = arr.map(function(v) {
return "foo"+ v;
});
console.log( arr );
Array.prototype.forEach()
Modifier le tableau d'origineatteint en ciblant ses clés par index arr[i]
var arr = ["1", 2, 3, 4];
arr.forEach(function(v, i) {
arr[i] = "foo" + v;
});
console.log( "Original:", arr );
Javascript est passé par valeur, ce qui signifie essentiellement que part
est un copy de la valeur dans le tableau.
Pour changer la valeur, accédez au tableau lui-même dans votre boucle.
arr[index] = 'new value';
La fonction .forEach peut avoir une fonction de rappel (eachelement, elementIndex) Donc, en gros, vous devez faire ceci:
arr.forEach(function(element,index){
arr[index] = "four"; //set the value
});
console.log(arr); //the array has been overwritten.
Ou, si vous souhaitez conserver le tableau d'origine, vous pouvez en faire une copie avant de suivre le processus ci-dessus . Pour faire une copie, vous pouvez utiliser:
var copy = arr.slice();
remplacez-le par l'index du tableau.
array[index] = new_value;
Avec les méthodes d'objet Array, vous pouvez modifier le contenu de l'objet Array, mais par rapport aux boucles for de base, ces méthodes sont dépourvues d'une fonctionnalité importante. Vous ne pouvez pas modifier l'index lors de l'exécution.
Par exemple, si vous voulez supprimer l'élément actuel et le placer à 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 pas de problème lors de la prochaine itération, vous obtiendrez le même élément suivant que si vous n'aviez rien fait.
Considérons ce code dans lequel nous déplaçons l'élément de la position d'index 5 vers l'index de position 2 une fois que l'indice compte jusqu'à 5.
var ar = [0,1,2,3,4,5,6,7,8,9];
ar.forEach((e,i,a) => {
i == 5 && a.splice(2,0,a.splice(i,1)[0])
console.log(i,e);
}); // 0 0 - 1 1 - 2 2 - 3 3 - 4 4 - 5 5 - 6 6 - 7 7 - 8 8 - 9 9
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, le tout prochain élément passera dans la position des éléments déplacés et lors de la prochaine itération, nous ne pourrons pas le voir ni l’évaluer.
Considérons ce code dans lequel nous déplaçons l'élément de la position d'index 5 vers l'index 7 une fois que l'index compte jusqu'à 5.
var a = [0,1,2,3,4,5,6,7,8,9];
a.forEach((e,i,a) => {
i == 5 && a.splice(7,0,a.splice(i,1)[0])
console.log(i,e);
}); // 0 0 - 1 1 - 2 2 - 3 3 - 4 4 - 5 5 - 6 7 - 7 5 - 8 8 - 9 9
Donc, nous n'avons jamais rencontré 6 dans la boucle. Normalement, dans une boucle for, vous devez décrémenter 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é. Ce n'est pas possible avec les méthodes de tableau. Vous ne pouvez pas modifier l'index. Vérifiez le code suivant
var a = [0,1,2,3,4,5,6,7,8,9];
a.forEach((e,i,a) => {
i == 5 && (a.splice(7,0,a.splice(i,1)[0]), i--);
console.log(i,e);
}); // 0 0 - 1 1 - 2 2 - 3 3 - 4 4 - 4 5 - 6 7 - 7 5 - 8 8 - 9 9
Comme vous le voyez lorsque nous décrémentons i
, il ne continuera pas de 5 à 6, d'où il a été laissé.
Alors gardez cela à l'esprit.
Voici une réponse similaire en utilisant une fonction de style =>
:
var data = [1,2,3,4];
data.forEach( (item, i, self) => self[i] = item + 10 );
donne le résultat:
[11,12,13,14]
Le paramètre self
n'est pas strictement nécessaire avec la fonction de style flèche, donc
data.forEach( (item,i) => data[i] = item + 10);
fonctionne aussi.
Pour ajouter ou supprimer entièrement des éléments susceptibles de modifier l’index, par extension de la suggestion de slice () de zhujy_8833 d’itérer sur une copie, comptez simplement le nombre d’éléments déjà supprimés ou ajoutés et modifiez l’index en conséquence. Par exemple, pour supprimer des éléments:
let values = ["A0", "A1", "A2", "A3", "A4", "A5", "A6", "A7", "A8"];
let count = 0;
values.slice().forEach((value, index) => {
if (value === "A2" || value === "A5") {
values.splice(index - count++, 1);
};
});
console.log(values);
// Expected: [ 'A0', 'A1', 'A3', 'A4', 'A6', 'A7', 'A8' ]
Pour insérer des éléments avant:
if (value === "A0" || value === "A6" || value === "A8") {
values.splice(index - count--, 0, 'newVal');
};
// Expected: ['newVal', A0, 'A1', 'A2', 'A3', 'A4', 'A5', 'newVal', 'A6', 'A7', 'newVal', 'A8' ]
Pour insérer des éléments après:
if (value === "A0" || value === "A6" || value === "A8") {
values.splice(index - --count, 0, 'newVal');
};
// Expected: ['A0', 'newVal', 'A1', 'A2', 'A3', 'A4', 'A5', 'A6', 'newVal', 'A7', 'A8', 'newVal']
Pour remplacer un élément:
if (value === "A3" || value === "A4" || value === "A7") {
values.splice(index, 1, 'newVal');
};
// Expected: [ 'A0', 'A1', 'A2', 'newVal', 'newVal', 'A5', 'A6', 'newVal', 'A8' ]
Remarque: si les insertions "avant" et "après" sont implémentées, le code doit gérer d'abord les insertions "avant", sinon l'inverse ne serait pas comme prévu