2016-04-22 11 views
1

In Ruby gibt es eine Methode namens Enumerable#cycle, die wiederholte Wiederholungen von x-mal in einer Sammlung ermöglicht. Ich suche nach etwas ähnlichem in JavaScript, konnte aber kein Äquivalent finden.Wie lautet der JavaScript-Code von Rubys Enumerable # -Zyklus?

Kennt jemand ein JavaScript, das zu Rubys Enumerable # Cycle äquivalent ist?

Kontext: Ich versuche, dasselbe Array in JavaScript zweimal zu durchlaufen. Sobald die Iteration das Ende erreicht hat, möchte ich, dass die Iteration am Anfang des Arrays beginnt und eventuell stoppt. Der Stoppteil ist nicht schwer - es ist der Zyklus der Iteration, den ich in JavaScript erreichen möchte. Ich konnte dies jedoch mit dieser Methode in Ruby machen.

+0

Es ist nicht zu schwer, sich selbst zu implementieren. Ruby hat eine große reiche stdlib, daher würde ich nicht erwarten, dass in JS-Land Äquivalente zu jeder Methode existieren. Selbst lodash und Unterstrich scheinen es nicht zu haben. –

Antwort

1

Ich denke, es gibt nichts, die eingebaut zu diesem äquivalent ist, aber wenn Sie benötigen Sie diesen Beitrag für weitere Einzelheiten folgen:

Javascript call a function several times with the arguments.

vorgesehen Neben den Optionen, können Sie auch das Array.prototype erweitern diese Methode zu aktivieren:

Array.prototype.cycle = function (n, callback) { 
    for (var i = 0; i < n; i++) { 
     this.forEach(callback); 
    } 
} 

und diese wie folgt verwenden:

eingebaut
a = [1, 2, 3, 4] 
a.cycle(2, function (i) { console.log(i); }); 
// this will print all the values two times 
1

Es gibt keine JavaScript (oder sogar nach meinem Wissen vorgeschlagen), die dies tun können. Es ist jedoch nicht schwer, sich selbst zu erreichen.

Nehmen wir einmal an, dass Sie über Arrays sprechen, und lassen Sie uns die Diskussion über das Modifizieren von Prototypen aufgeben oder nicht. Die einfache Version von dem, was Sie wollen, könnte sein:

Array.prototype.cycle = function(cycleCount, callback) { 
    for(var i = 0; i < cycleCount; i++) { 
    this = this.map(callback); 
    } 
} 

Nehmen wir an, Sie haben eine Reihe von Zahlen. Dann könnte man dies nennen, indem Sie:

myNumberArray.cycle(2, function(num, i) { 
    return num * 2; 
}); 

Wir könnten sogar Lust bekommen, und lassen Sie sich für jeden Zyklus eine andere Aktion angeben:

Array.prototype.cycle = function(cycleCount, callback) { 
    if(Object.prototype.toString.call(callback) === '[object Array]') { 
    if(callback.length === cycleCount) { 
     for(var i = 0; i < cycleCount; i++) { 
     this = this.map(callback[i]); 
     } 
    } else { 
     // Uhoh, we don't have the right number of callbacks 
     throw new Error('If using multiple callbacks, the umber of callback\'s must match the number of cycles'); 
    } 
    } else { 
    for(var i = 0; i < cycleCount; i++) { 
     this = this.map(callback); 
    } 
    } 
} 

Es gibt mehr Fehler Überprüfung Sie tun müssten mach das robust, aber du kommst auf die Idee. :)

+0

Es ist nützlich (imo), vor dem Hinzufügen von Methoden zu einem Prototyp einen Check hinzuzufügen: 'if (! ('Cycle' in Array.prototype) {...' – Andy