2012-04-20 8 views
11

Estoy buscando un equivalente de Ruby's Enumerable # each_slice en Javascript.Equivalente a Ruby Enumerable # each_slice en Javascript?

ya estoy usando los grandes underscore.js que tiene cada uno(), del mapa(), inyecte() ...

Básicamente, en Ruby este gran método hace esto:

[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

Para el que busque una solución jQuery existe https://github.com/burin/jquery-each_slice – Espen

Respuesta

11

que modificaría la respuesta de Brandan ligeramente para encajar mejor dentro del entorno de JavaScript más 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); 
    } }}); 

Aquí hay una demo.

+0

Disculpe, ¿cómo utilizo esto? – fabian

+0

primero, el código asume que ya está usando 'underscore.js'; no hay objeto '_' con un método' mixin' en caso contrario. Si ha cargado guiones bajos y ejecuta el código anterior, entonces tendrá un método '_.eachSlice' que funciona según lo solicitado; ver la demostración jsfiddle vinculada en mi respuesta. –

9

¿qué tal esto:

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

de salida (en Node.js):

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

Gracias ! ¡Estoy probando esto ahora mismo! –

+0

Dale un tiro a la respuesta de Mark Reed. No estoy familiarizado con underscore.js. – Brandan

3

que he encontrado en _.chunk lodash es una solución mejor ahora

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

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

https://lodash.com/docs#chunk

+0

Esto funcionó perfectamente, gracias por la propina! – Brandon

Cuestiones relacionadas