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.