remove from array all javascript functional-programming underscore.js lodash

from - Divida el conjunto de JavaScript en fragmentos utilizando underscore.js



lodash pluck (5)

Necesito dividir una matriz de Javascript en n trozos de tamaño.

Por ejemplo: dado este conjunto

["a1", "a2", "a3", "a4", "a5", "a6", "a7", "a8", "a9", "a10", "a11", "a12", "a13"]

y a n es igual a 4, la salida debería ser esta:

[ ["a1", "a2", "a3", "a4"], ["a5", "a6", "a7", "a8"], ["a9", "a10", "a11", "a12"], ["a13"] ]

Conozco las solutions puras de JavaScript para este problema, pero como ya uso underscore.js , me pregunto si los guiones bajos ofrecen una mejor solución para esto.

Editar:

Creé una prueba jsPerf para comprobar cuánto más lenta es la solución de subrayado.


Eche un vistazo a lodash '' chunk : https://lodash.com/docs#chunk

var data = ["a1", "a2", "a3", "a4", "a5", "a6", "a7", "a8", "a9", "a10", "a11", "a12", "a13"]; _.chunk(data, 3); // [ // ["a1", "a2", "a3"], // ["a4", "a5", "a6"], // ["a7", "a8", "a9"], // ["a10", "a11", "a12"], // ["a13"] // ]


Para una solución basada en Underscore, pruebe esto:

var data = ["a1", "a2", "a3", "a4", "a5", "a6", "a7", "a8", "a9", "a10", "a11", "a12", "a13"]; var n = 3; var lists = _.groupBy(data, function(element, index){ return Math.floor(index/n); }); lists = _.toArray(lists); //Added this to convert the returned object to an array. console.log(lists);

Usando el método de envoltura de cadena puede combinar las dos declaraciones de la siguiente manera:

var data = ["a1", "a2", "a3", "a4", "a5", "a6", "a7", "a8", "a9", "a10", "a11", "a12", "a13"]; var n = 3; var lists = _.chain(data).groupBy(function(element, index){ return Math.floor(index/n); }).toArray() .value();


Una expresión posiblemente más simple:

_.range(coll.length / n).map(i => coll.slice(i * n, (i + 1) * n))


Underscore admite _.chunk() forma nativa desde la versión 1.9.0.

let data = ["a1", "a2", "a3", "a4", "a5", "a6", "a7", "a8", "a9", "a10", "a11", "a12", "a13"]; _.chunk(data, 4); // [ // ["a1", "a2", "a3", "a4"], // ["a5", "a6", "a7", "a8"], // ["a9", "a10", "a11", "a12"], // ["a13"] // ]


intente con esto, es mucho más práctico (por ejemplo, si desea dividir la matriz en función de la cantidad de elementos que serán contenedores en cada matriz secundaria):

function chunk(arr, start, amount){ var result = [], i, start = start || 0, amount = amount || 500, len = arr.length; do { //console.log(''appending '', start, ''-'', start + amount, ''of '', len, ''.''); result.push(arr.slice(start, start+amount)); start += amount; } while (start< len); return result; };

y el uso en tu caso:

var arr = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17], chunked = chunk(arr, 0, Math.floor(arr.length/3)); //to get 4 nested arrays console.log(chunked);

y otro caso:

var arr = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17], chunked = chunk(arr, 0, 3); // to get 6 nested arrays each containing maximum of 3 items console.log(chunked);