webentwicklung-frage-antwort-db.com.de

Gibt es in nodeJs eine Möglichkeit, ein Array zu durchlaufen, ohne die Arraygröße zu verwenden?

Sagen wir, ich habe 

myArray = ['item1', 'item2']

Ich habe es versucht 

for (var item in myArray) {console.log(item)}

Es druckt 0 1

Was ich wünsche, ist zu haben Gegenstand 1 item2

Gibt es eine andere Syntax, die ohne Verwendung funktioniert? 

for (var i = 0; i < myArray.length; i++)
45
user310291

Sie können Array.forEach verwenden.

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

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

86
makenova

Was Sie wahrscheinlich wollen, ist for...of , ein relativ neues Konstrukt, das zum ausdrücklichen Aufzählen der Werte iterierbarer Objekte erstellt wurde:

let myArray = ["a","b","c","d"];
for (let item of myArray) {
  console.log(item);
}

... im Unterschied zu for...in , das property names (vermutlich1 numerische Indizes bei Arrays). Ihre Schleife zeigte unerwartete Ergebnisse an, da Sie die Eigenschaftsnamen nicht verwendet haben, um die entsprechenden Werte über Klammer-Notation ... abzurufen. Sie könnten jedoch Folgendes haben:

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  Unglücklicherweise hat jemand dem Array oder seiner Prototypkette zählbare Eigenschaften hinzugefügt, die nicht numerische Indizes ... oder sie haben möglicherweise einen Index zugewiesen, der nicht zugewiesene Indizes im Zwischenbereich belässt. Die Probleme werden ziemlich gut erklärt hier . Der wichtigste Aspekt ist, dass es am besten ist, explizit von 0 Nach array.length - 1 Zu wechseln, anstatt for...in Zu verwenden.

Das ist also keine akademische Frage (wie ich ursprünglich gedacht hatte), d. H .:

Ohne Rücksicht auf Praktikabilität, ist es möglich, length zu vermeiden, wenn über ein Array iteriert wird?

Nach Ihr Kommentar (Hervorhebung von mir):

[...] warum muss ich die Größe eines Arrays berechnen, während der Interpreter es wissen kann?.

Sie haben eine falsche Abneigung gegen Array.length. Es wird nicht im laufenden Betrieb berechnet. Es wird aktualisiert, wenn sich die Länge des Arrays ändert. Sie werden keine Leistungsverbesserungen sehen, wenn Sie dies vermeiden (abgesehen von der Zwischenspeicherung der Array-Länge anstelle des Zugriffs auf die Eigenschaft):

loop test

Selbst wenn Sie eine geringfügige Leistungssteigerung erzielen würden, würde dies meines Erachtens nicht ausreichen, um das Risiko einer Lösung der oben genannten Probleme zu rechtfertigen.

47
canon

Um 'item1', 'item2' zu drucken, würde dieser Code funktionieren.

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

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

In ES5 gibt es keine effiziente Möglichkeit, ein sparse - Array ohne Verwendung der length-Eigenschaft zu durchlaufen. In ES6 können Sie for...of verwenden. Nehmen Sie diese Beispiele:

'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>

Alle Array-Methoden, die Sie verwenden können, um sicher über Arrays dense zu iterieren, verwenden die length-Eigenschaft eines Objekts, das durch den Aufruf von ToObject intern erstellt wird. Siehe zum Beispiel den in der forEach-Methode verwendeten Algorithmus: http://www.ecma-international.org/ecma-262/5.1/#sec-15.4.4.18 In es6 ist dies jedoch möglich Verwenden Sie for...of sicher zum Durchlaufen von Arrays mit geringer Dichte.

Siehe auch Sind Javascript-Arrays spärlich? .

3
borisdiakur

Dies ist die natürliche Javascript-Option

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

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

Es funktioniert jedoch nicht, wenn Sie wait innerhalb der forEach-Schleife verwenden, da forEach nicht asynchron ist. Sie werden gezwungen, die zweite Antwort oder eine andere Entsprechung zu verwenden:

let myArray = ["a","b","c","d"];
for (let item of myArray) {
  console.log(item);
}

Oder Sie können ein asyncForEach erstellen, das hier erklärt wird:

https://codeburst.io/javascript-async-await-foreach-b6ba62bbf404

2
Itamar Lev
    var count=0;
    let myArray = '{"1":"a","2":"b","3":"c","4":"d"}'
    var data = JSON.parse(myArray);
    for (let key in data) {
      let value =  data[key]; // get the value by key
      console.log("key: , value:", key, value);
      count = count + 1;
    }
   console.log("size:",count);
0
Mukesh Kumar

Verwenden Sie Iteratoren ...

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)
}

Ausführlichere Übersicht: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Iteration_protocols

0
indospace.io