2012-04-20 6 views
11

Ich bin auf der Suche nach einem Gegenstück von Ruby Enumerable # each_slice in Javascript.Entspricht Ruby Enumerable # each_slice in Javascript?

Ich verwende bereits die großen Underscore.js, die jede() Karte() hat, injizieren() ...

Grundsätzlich in Ruby diese großartige Methode tut dies:

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10].each_slice(3) {|a| p a} 

# outputs below 
[1, 2, 3] 
[4, 5, 6] 
[7, 8, 9] 
[10] 
+0

Für jedermann gefunden ist https://github.com/burin/jquery-each_slice – Espen

Antwort

11

würde ich Brandan Antwort ändern etwas besser passen in der Umgebung von JavaScript und Underscore.js:

_.mixin({ "eachSlice": function(obj, size, iterator, context) { 
    for (var i=0, l=obj.length; i < l; i+=size) { 
     iterator.call(context, obj.slice(i,i+size), i, obj); 
    } }}); 

hier ein demo.

+0

Sorry, wie benutze ich das? – fabian

+0

Der Code geht zunächst davon aus, dass Sie bereits "underscore.js" verwenden. Es gibt kein '_' Objekt mit einer' Mixin' Methode. Wenn Sie Unterstrich geladen haben und den obigen Code ausführen, haben Sie dann eine '_.eachSlice'-Methode, die wie gewünscht funktioniert; Siehe die jsfiddle Demo, die in meiner Antwort verlinkt ist. –

9

Wie wäre es damit:

Array.prototype.each_slice = function (size, callback){ 
    for (var i = 0, l = this.length; i < l; i += size){ 
    callback.call(this, this.slice(i, i + size)); 
    } 
}; 

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10].each_slice(3, function (slice){ 
    console.log(slice); 
}); 

Ausgang (in Node.js):

[ 1, 2, 3 ] 
[ 4, 5, 6 ] 
[ 7, 8, 9 ] 
[ 10 ] 
+0

Vielen Dank ! Ich teste das gerade jetzt! –

+0

Gib Mark Reeds Antwort auch eine Chance. Ich kenne mich mit underscore.js nicht aus. – Brandan

3

Ich habe _.chunk in lodash eine bessere Lösung ist jetzt für eine jQuery Lösung suchen dort

var chunk = require('lodash/array/chunk'); 

_.chunk(['a', 'b', 'c', 'd'], 2); 
// -> [['a', 'b'], ['c', 'd']] 

https://lodash.com/docs#chunk

+0

Das hat perfekt funktioniert, danke für den Tipp! – Brandon