In ES6 haben wir jetzt iterators und , um sie zu iterieren. wir haben einige eingebaute für arrays; insbesondere keys, values und entries.ES6 reverse iterieren ein Array unter Verwendung von for..of, habe ich etwas in der Spezifikation verpasst?
Diese Methoden ermöglichen es, einen Großteil der Iteration durchzuführen, die normalerweise ausgeführt wird. Aber was ist mit Iteration in umgekehrter Richtung? Dies ist auch eine sehr häufige Aufgabe und ich sehe nichts in der spec speziell dafür? Oder vielleicht habe ich es verpasst?
Ok, wir haben Array.prototype.reverse, aber ich möchte nicht unbedingt ein großes Array an Ort und Stelle umkehren und dann wieder umkehren, wenn Sie fertig sind. Ich möchte auch Array.prototype.slice nicht verwenden, um eine temporäre flache Kopie zu erstellen und das nur für Iteration umzukehren.
Also schaute ich mir eine generators und kam mit diesen funktionierenden Lösungen.
(function() {
'use strict';
function* reverseKeys(arr) {
let key = arr.length - 1;
while (key >= 0) {
yield key;
key -= 1;
}
}
function* reverseValues(arr) {
for (let key of reverseKeys(arr)) {
yield arr[key];
}
}
function* reverseEntries(arr) {
for (let key of reverseKeys(arr)) {
yield [key, arr[key]];
}
}
var pre = document.getElementById('out');
function log(result) {
pre.appendChild(document.createTextNode(result + '\n'));
}
var a = ['a', 'b', 'c'];
for (var x of reverseKeys(a)) {
log(x);
}
log('');
for (var x of reverseValues(a)) {
log(x);
}
log('');
for (var x of reverseEntries(a)) {
log(x);
}
}());
<pre id="out"></pre>
Ist das wirklich die Art und Weise, die Iteration umkehren wird in ES6 soll oder habe ich etwas Grundlegendes in der Spezifikation verpasst?
Nein, die Spezifikation hat wirklich nichts dergleichen. Aber wie Sie sehen, ist es ganz einfach, mit Generatoren zu schreiben. – Bergi
Ich denke, es gab einige Diskussionen auf der Mailingliste bezüglich reversibler Iteratoren. Edit: Ah, hier ist es: https://esdiscuss.org/topic/reverseterable-interface – Bergi
@Bergi Danke, nicht viel Diskussion, aber ein Vorschlag und dann ruhig, und jetzt definitiv nicht in der Spezifikation. Die wichtigsten Dinge, die fehlen, sind die umgekehrte Iteration von Arrays und mit Strings; Schlüssel und Einträge (Werte gibt es, aber nicht Name, muss 'Symbol.iterator' verwenden) und umgekehrte Methoden. Ja, die Array-Generatoren waren trivial, aber die Strings ein wenig komplexer, immer noch nicht etwas, das ich immer wieder schreiben und neu schreiben möchte. Ich werde eine Antwort auf meine Frage mit einem Code posten, den ich verwende, um die Lücke zu füllen. – Xotic750