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