web-dev-qa-db-fra.com

Dans nodeJs, existe-t-il un moyen de parcourir un tableau sans utiliser la taille du tableau?

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++)
45
user310291

Vous pouvez utiliser Array.forEach

var myArray = ['1','2',3,4]

myArray.forEach(function(value){
  console.log(value);
});

86
makenova

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é):

 loop test

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.

37
canon

Pour imprimer 'item1', 'item2', ce code fonctionnerait.

var myarray = ['hello', ' hello again'];

for (var item in myarray) {
    console.log(myarray[item])
}
4
Shikhar Saxena

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? .

3
borisdiakur

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

0
indospace.io