106 votes

Diviser un tableau JavaScript en morceaux en utilisant Lodash

J'ai besoin de diviser un tableau JavaScript en morceaux de taille n.

Par exemple : étant donné ce tableau

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

et un n égal à 4, la sortie devrait être celle-ci :

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

Je connais des solutions en JavaScript pur pour ce problème, mais comme j'utilise déjà Lodash, je me demande si Lodash fournit une meilleure solution pour cela.

Édition :

J'ai créé un test jsPerf pour vérifier à quel point la solution avec underscore est plus lente.

168voto

Edo Points 11

Jetez un coup d'œil à la fonction chunk de lodash : https://lodash.com/docs#chunk

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

91voto

Chandu Points 40028

Pour une solution basée sur Underscore, essayez ceci :

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); //Ajout de ceci pour convertir l'objet retourné en tableau.
console.log(lists);

En utilisant la méthode d'enveloppeur en chaîne, vous pouvez combiner les deux déclarations comme ci-dessous :

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

7voto

user9027325 Points 95

Underscore prend en charge _.chunk() nativement à partir de la version 1.9.0.

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

6voto

user1009908 Points 368

Une expression peut-être plus simple:

const coll = [ "a1", "a2", "a3", "a4", "a5", "a6", "a7", "a8", "a9" ];
const n = 2;
const chunks = _.range(coll.length / n).map(i => coll.slice(i * n, (i + 1) * n));
console.log(chunks);

1voto

Essayez celui-ci, il est beaucoup plus pratique (par exemple, si vous voulez diviser le tableau en fonction du nombre d'éléments à contenir dans chaque sous-tableau):

function chunk(arr, start, amount){
    var result = [], 
        i, 
        start = start || 0, 
        amount = amount || 500, 
        len = arr.length;

    do {
        //console.log('ajout de ', start, '-', start + amount, 'de ', len, '.');
        result.push(arr.slice(start, start+amount));
        start += amount;

    } while (start< len);

    return result;
};

et l'utilisation dans votre cas:

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)); // pour obtenir 4 tableaux imbriqués

console.log(chunked);

et un autre cas:

var arr = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17],
    chunked = chunk(arr, 0, 3); // pour obtenir 6 tableaux imbriqués contenant chacun au maximum 3 éléments

console.log(chunked);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X