JavaScript конкретный c способ отключения массива - PullRequest
2 голосов
/ 30 апреля 2020

У меня есть массив, подобный этому:

[{i: 0, abc: true}, {i: 1, abc: true}, {i: 2, abc: true}, {i: 3, abc: true}, {i: 4, abc: true}, {i: 5, abc: true}, {i: 6, abc: true}, {i: 7, abc: true}, {i: 8, abc: true}, {i: 9, abc: true}, {i: 10, abc: true}, {i: 11, abc: true}, ]

Мне тоже нужно разбить его на выходные данные, примерно так:

[[{i: 0, abc: true}, {i: 1, abc: true}, {i: 2, abc: true}], [{i: 3, abc: true}, {i: 4, abc: true}, {i: 5, abc: true}], [{i: 5, abc: true}, {i: 6, abc: true}, {i: 7, abc: true}], [{i: 7, abc: true}, {i: 8, abc: true}, {i: 9, abc: true}], [{i: 9, abc: true}, {i: 10, abc: true}, {i: 11, abc: true}] ]

Последний объект в подмассиве такой же, как первый объект в следующем подмассиве.

В настоящее время я пишу что-то вроде этого:

const chunk = (arr, size) => Array.from( { length: Math.ceil(arr.length / size) }, (v, i) =>
arr.slice(i * size, i * size + size));

, но он разбивается только на указанное c количество элементов. Я также могу достичь своей цели с помощью странных вложенных циклов ... но, может быть, кто-то знает лучше ... проще?

Ответы [ 2 ]

1 голос
/ 01 мая 2020

Вот очень простой способ, как это сделать.

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

Подтверждение скрипки: https://jsfiddle.net/2pzcLv9k/

   const result = input.reduce((acc, x, i) => {
   if (i % 3 === 0) {
     acc.push([x])
   } else {
     acc[acc.length - 1].push(x)
   }
   return acc;
 }, [])
1 голос
/ 01 мая 2020

Вы можете удалить 1 из начала и конца слайса, если текущий индекс чанка (i) не равен 0. Однако, поскольку мы перемещаем индекс назад на 1, у нас может быть больше чанков. Нам нужно сравнить общее количество блоков с уменьшенным индексом и без, и соответственно добавить к числу страниц.

const chunkMinus1 = (arr, size) => {
  const chunks = Math.ceil(arr.length / size)
  const maxItems = chunks * (size - 1) + 1
  const length = chunks + Math.ceil(Math.max(arr.length - maxItems, 0) / size)
  
  return Array.from(
    { length }, 
    (v, i) => arr.slice(i * size - (i ? 1 : 0), i * size + size - (i ? 1 : 0))
  )
};

const arr = [{i: 0, abc: true}, {i: 1, abc: true}, {i: 2, abc: true}, {i: 3, abc: true}, {i: 4, abc: true}, {i: 5, abc: true}, {i: 6, abc: true}, {i: 7, abc: true}, {i: 8, abc: true}, {i: 9, abc: true}, {i: 10, abc: true}, {i: 11, abc: true}]

const result = chunkMinus1(arr, 6)

console.log(result)
...