2012-04-20 14 views
11

Szukam odpowiednika Ruby's Enumerable # each_slice w JavaScript.Równoważna liczba rubinowa # each_slice w JavaScript?

jestem już przy użyciu wielkich underscore.js że ma each(), mapy() wstrzyknąć() ...

Zasadniczo, w Ruby to świetny sposób robi to:

[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

Dla każdego, kto szuka rozwiązania jQuery jest https://github.com/burin/jquery-each_slice – Espen

Odpowiedz

11

chciałbym modyfikować odpowiedź Brandan nieznacznie lepiej pasować do otoczenia JavaScript powiększonej 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); 
    } }}); 

Oto demo.

+0

Przepraszam, jak mogę tego użyć? – fabian

+0

po pierwsze, kod zakłada, że ​​już używasz 'underscore.js'; w przeciwnym razie nie ma obiektu '_' z metodą' mixin'. Jeśli załadowałeś podkreślenie i uruchomiłeś powyższy kod, będziesz miał wtedy metodę '_.eachSlice', która działa zgodnie z żądaniem; zobacz demo jsfiddle połączone w mojej odpowiedzi. –

9

Jak o tym:

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

wyjściowa (w node.js):

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

Dzięki ! Testuję to teraz! –

+0

Prześlij też odpowiedź Marka Reeda. Nie znam pliku underscore.js. – Brandan

3

Znalazłem _.chunk w lodash jest lepszym rozwiązaniem teraz

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

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

https://lodash.com/docs#chunk

+0

To działało idealnie, dzięki za napiwek! – Brandon