2015-09-07 10 views
7

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?

+0

Nein, die Spezifikation hat wirklich nichts dergleichen. Aber wie Sie sehen, ist es ganz einfach, mit Generatoren zu schreiben. – Bergi

+0

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

+0

@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

Antwort

6

Ist das wirklich die Art, in der die umgekehrte Iteration in ES6 beabsichtigt ist?

Es gab einen Vorschlag für die reverse Iteration, diskutiert auf esdicuss und ein git Projekt spec umreißt, aber nicht viel schien in Bezug auf es geschehen. ES6 ist jetzt fertiggestellt, also wird es dieses Mal nicht hinzugefügt. Wie auch immer, für Arrays und Strings habe ich ein wenig Code geschrieben um die Lücken zu füllen (meiner Meinung nach) und ich werde es hier posten, da es anderen helfen kann. Dieser Code basiert auf meinen heutigen Browsern und einige Verbesserungen könnten möglicherweise vorgenommen werden, wenn mehr von ES6 auf ihnen implementiert wäre. Ich komme vielleicht später zu einem Kern oder einem kleinen Github-Projekt.

Update: Ich habe ein GitHub Projekt für die Arbeit an diesem erstellt.

+0

Ich denke, die Vorschlag wurde für ES7 sowieso gehalten ... – Bergi

+0

Es scheint seltsam, dass sie nicht für ES6 angegangen wurden, aber ho hum ich habe einige Arbeitscode und ich denke, ich bin glücklich. :) – Xotic750

+0

würde gerne einige tatsächliche Beispiele auf diesem GitHub sehen, auf Nutzung. –