Disons que j'ai
myArray = ['item1', 'item2']
J'ai essayé
for (var item in myArray) {console.log(item)}
Il imprime 0 1
Ce que je souhaite, c'est avoir objet 1 item2
Existe-t-il une autre syntaxe qui fonctionne sans utiliser
for (var i = 0; i < myArray.length; i++)
Vous pouvez utiliser Array.forEach
var myArray = ['1','2',3,4]
myArray.forEach(function(value){
console.log(value);
});
Ce que vous voulez probablement, c'est for...of
, une construction relativement nouvelle construite dans le seul but d'énumérer les valeurs d'objets itérables:
let myArray = ["a","b","c","d"];
for (let item of myArray) {
console.log(item);
}
... par opposition à for...in
, qui énumère la propriété noms (vraisemblablement1 indices numériques dans le cas de tableaux). Votre boucle affichait des résultats inattendus car vous n'utilisiez pas les noms de propriétés pour obtenir les valeurs correspondantes via notation crochet ..., mais vous pourriez avoir:
let myArray = ["a","b","c","d"];
for (let key in myArray) {
let value = myArray[key]; // get the value by key
console.log("key: %o, value: %o", key, value);
}
1 Malheureusement, quelqu'un peut avoir ajouté propriétés énumérables au tableau ou à sa chaîne de prototypes qui sont non indices numériques ... ou ils peuvent avoir affecté un index laissant des index non attribués dans l'intervalle. intervalle. Les problèmes sont assez bien expliqués ici . La principale chose à retenir est qu'il est préférable de passer explicitement de 0
à array.length - 1
plutôt que d'utiliser for...in
.
Donc, ce n’est pas (comme je le pensais à l’origine) une question académique, à savoir:
Sans égard pour pratique, est-ce qu'il est possible d'éviter
length
lors d'une itération sur un tableau?
Selon votre commentaire (c'est moi qui souligne):
[...] pourquoi ai-je besoin de calculer la taille d'un tableau alors que l'interpréteur peut le savoir?.
Vous avez une aversion erronée pour Array.length
. Ce n'est pas calculé à la volée; il est mis à jour chaque fois que la longueur du tableau change. Vous ne constaterez pas de gain de performances en l'évitant (mis à part la mise en cache de la longueur du tableau plutôt que l'accès à la propriété):
Maintenant, même si vous obteniez une augmentation de performance marginale, je doute que cela suffise à justifier le risque de traiter les problèmes susmentionnés.
Pour imprimer 'item1', 'item2', ce code fonctionnerait.
var myarray = ['hello', ' hello again'];
for (var item in myarray) {
console.log(myarray[item])
}
Dans ES5, il n’existe aucun moyen efficace de parcourir un tableau sparse sans utiliser la propriété length. Dans ES6, vous pouvez utiliser for...of
. Prenons ces exemples:
'use strict';
var arr = ['one', 'two', undefined, 3, 4],
output;
arr[6] = 'five';
output = '';
arr.forEach(function (val) {
output += val + ' ';
});
console.log(output);
output = '';
for (var i = 0; i < arr.length; i++) {
output += arr[i] + ' ';
}
console.log(output);
output = '';
for (var val of arr) {
output += val + ' ';
};
console.log(output);
<!-- results pane console output; see http://meta.stackexchange.com/a/242491 -->
<script src="//gh-Canon.github.io/stack-snippet-console/console.min.js"></script>
Toutes les méthodes de tableau que vous pouvez utiliser pour parcourir en toute sécurité les tableaux dense utilisent la propriété length
d'un objet créé en appelant ToObject
internaly. Voir par exemple l'algorithme utilisé dans la méthode forEach
: http://www.ecma-international.org/ecma-262/5.1/#sec-15.4.4.18 Cependant, dans es6, vous pouvez utiliser for...of
safe pour effectuer une itération sur des tableaux dispersés.
Voir aussi Les tableaux Javascript sont-ils clairsemés? .
Utiliser les itérateurs ...
var myarray = ['hello', ' hello again'];
processArray(myarray[Symbol.iterator](), () => {
console.log('all done')
})
function processArray(iter, cb) {
var curr = iter.next()
if(curr.done)
return cb()
console.log(curr.value)
processArray(iter, cb)
}
Aperçu plus détaillé: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Iteration_protocols