Как разбить объединенный массив с разделителем на куски - PullRequest
3 голосов
/ 22 февраля 2020

У меня есть массив строк

const arr = ['some', 'word', 'anotherverylongword', 'word', 'yyy', 'u']
const joined = arr.join(';')

Я хочу получить массив кусков, длина объединенной строки которых не превышает 10

, например, вывод будет:

[
    ['some;word'], // joined string length not greater than 10
    ['anotherverylongword'], // string length greater than 10, so is separated
    ['word;yyy;u'] // joined string length is 10
]

1 Ответ

3 голосов
/ 22 февраля 2020

Вы можете использовать reduce (с некоторыми spread syntax и slice) для генерации таких кусков:

const arr = ['some', 'word', 'anotherverylongword', 'word', 'yyy', 'u'];
const chunkSize = 10;

const result = arr.slice(1).reduce(
  (acc, cur) =>
    acc[acc.length - 1].length + cur.length + 1 > chunkSize
      ? [...acc, cur]
      : [...acc.slice(0, -1), `${acc[acc.length - 1]};${cur}`],
  [arr[0]]
);

console.log(result);

Идея состоит в построении массива с кусками (result), начиная с первого элемента с arr (второй параметр - reduce функция), и затем для каждого из оставшихся элементов arr (arr.slice(1)) проверяем, можно ли его добавить к последнему элементу аккумулятора (acc). В конечном итоге аккумулятор становится окончательным возвращаемым значением reduce, присвоенным result.

...