J'ai un tableau
const myArray = [1, 2, 2, 2, 3, 3, 3, 4, 4, 4];
qui Je veux me diviser en plus petits tableaux. J'utilise un morceau de lodash pour le faire.
_.chain(myArray).reverse().chunk(3).reverse().value()
cela retournera
[1], [2, 2, 2], [3, 3, 3], [4, 4, 4]
mais je voudrais qu'il retourne
[1, 2, 2], [2, 3, 3], [3, 4, 4], [4]
ma solution était la suivante
_.chunk(myArray, 3);
il inverse le tableau, le divise puis l'inverse à nouveau. Mais y a-t-il une meilleure façon de faire cela? Le bloc commence donc par la fin et non par le début.
3 Réponses :
Il n'y a pas d'option d'argument intégrée pour cela (ou une méthode distincte comme chunkEnd
), mais il est trivial d'écrire quelque chose vous-même qui réalise la même chose sans reverse
array:
const chunkFromEnd = (arr, size) => { const firstSize = arr.length % size; const result = [arr.slice(0, firstSize)]; for (let i = firstSize; i < arr.length; i += size) { result.push(arr.slice(i, i + size)); } return result; }; console.log(chunkFromEnd([1, 2, 2, 2, 3, 3, 3, 4, 4, 4], 3)); console.log(chunkFromEnd([1, 2, 2, 2, 3, 3, 3, 4, 9, 4, 4, 6, 2, 1], 3));
Une alternative pourrait être d'utiliser la fonction reduceRight
.
.as-console-wrapper { max-height: 100% !important; top: 0; }
const myArray = [1, 2, 2, 2, 3, 3, 3, 4, 4, 4]; const chunks = myArray.reduceRight((a, n, i, arr) => { if (((arr.length - 1) - i) % a.chunk === 0) { a.current = []; a.chunks.unshift(a.current); } a.current.push(n); return a; }, { /*This is the size per chunk*/chunk: 3, /*The array with the chunks*/ chunks: [], /*The current array which is being filled*/ current: []}).chunks; console.log(chunks);
Votre revers inversera probablement également l'ordre des éléments dans chaque sous-tableau. Vous ne le voyez peut-être pas car ils ont tous la même valeur, mais vous devriez probablement vérifier avec des données plus diverses
La solution doit-elle utiliser Lodash ou vanilla JS est-il également approprié?
@Phil Hey. Vous avez raison. Maintenant, quand je l'ai testé avec des données plus diverses, il inverse les sous-tableaux. La solution doit utiliser lodash mais vanilla js convient tant que ce n'est pas trop de code.