Как разделить массив на несколько равных частей в JS

У меня была проблема.

Массив содержал много элементов, и я хотел разделить его на несколько частей.

Я придумал 2 совершенно разных решения.

A) Первый заключался в том, чтобы разделить массив на равные части, например, части из 2 или 3 элементов B) Второй заключался в создании n частей и добавлении к ней равного переменного набора элементов

Другое дело, как и почему мы разделяем. Решение (A) отлично подходит, когда вы не знаете, сколько групп у вас получится, и вам все равно, но вы знаете, что хотите X элементов в каждом новом массиве, который вы создаете.

Решение (B) отлично подходит, когда вы знаете, сколько групп хотите создать, и строго придерживаетесь этого, но не заботитесь о том, сколько элементов будет содержать каждый новый массив.

Другими словами, с массивом вроде

[ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

С помощью решения (A) мы можем создать блоки по 2 элемента и получить

[ 1, 2 ]
[ 3, 4 ]
[ 5, 6 ]
[ 7, 8 ]
[ 9, 10 ]

or chunks of 3 items:

[ 1, 2, 3 ]
[ 4, 5, 6 ]
[ 7, 8, 9 ]
[ 10 ]

With solution (B) we can divide the array in 2 arrays, and get:

[ 1, 2, 3, 4, 5 ]
[ 6, 7, 8, 9, 10 ]

Or we can divide the array in 3 arrays, and get:

[ 1, 2, 3, 4 ]
[ 4, 5, 6, 7]
[ 8, 9, 10 ]

Here is the implementation of (A):

const items = [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10] //… your array, filled with values
const n = 3 //tweak this to add more items per line

const result = new Array(Math.ceil(items.length / n))
  .fill()
  .map(_ => items.splice(0, n))

In this example result is a new array of arrays:

[ 
  [ 1, 2, 3 ], 
  [ 4, 5, 6 ], 
  [ 7, 8, 9 ], 
  [ 10 ] 
]

Here is the implementation of (B), assuming you want an array of 3 arrays as a result:

const items = [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10] //… your array, filled with values

const n = 3
const result = [[], [], []] //we create it, then we'll fill it

const wordsPerLine = Math.ceil(items.length / 3)

for (let line = 0; line < n; line++) { for (let i = 0; i < wordsPerLine; i++) { const value = items[i + line * wordsPerLine] if (!value) continue //avoid adding “undefined” values result[line].push(value) } }

In this example result is

[ 
  [ 1, 2, 3, 4 ], 
  [ 5, 6, 7, 8 ], 
  [ 9, 10 ] 
]  

More js tutorials: