Как разбить массив на множество других массивов с двумя указанными размерами c? - PullRequest
0 голосов
/ 06 мая 2020

Я пытаюсь выяснить, есть ли способ разбить массив на множество других массивов, но эти массивы должны иметь длину 4 и 8. Например:

const someArray = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,23,24,25];

output newArray = [[1,2,3,4],
                   [5,6,7,8,9,10,11,12],
                   [13,14,15,16],
                   [17,18,19,20,21,22,23,24],
                   [25]];

Я видел много решений для разбивки на определенные c отдельные размеры, например:

export const chunk = (array, size) => {
  const chunkedArr = [];
  let copiedArr = [...array];
  const numOfChild = Math.ceil(copiedArr.length / size);

  for (let i = 0; i < numOfChild; i++) {
    chunkedArr.push(copiedArr.splice(0, size));
  }
  return chunkedArr;
};

, которые я пытался «адаптировать» к своим требованиям, но безуспешно.

Любая помощь? Ура!

Ответы [ 3 ]

2 голосов
/ 06 мая 2020

Простая реализация, использующая массив с рекурсивной функцией:

const someArray = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,23,24,25];


const iter = (sliceLen, arr, acc = []) =>
 arr.length <= sliceLen 
 ? [...acc, arr.slice(0, sliceLen)]
 : iter(sliceLen === 4 ? 8 : 4, arr.slice(sliceLen), [...acc, arr.slice(0, sliceLen)])
 
 const r = iter(4, someArray)
 
 console.log(r)
2 голосов
/ 06 мая 2020

Для этого можно использовать Array.slice () вместе с соответствующими индексами.

const someArray = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,23,24,25];

let i = 0;
let step = 4;
const newArray = [];
while(i < someArray.length) { 
  newArray.push(someArray.slice(i, i + step));
  i += step;
  step = step == 4 ? 8 : 4;
}

console.log(newArray);
0 голосов
/ 06 мая 2020

Один из подходов к этому - просто переключаться между размером блока для итерации.

const someArray =  [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,23,24,25];

console.log(
  chunk(someArray, 4, 8)
);

function chunk(input, size1, size2){
  const output = [];
  let chunkSize = size1;
  
  for (let i = 0; i < input.length;) {
    output.push(input.slice(i).slice(0, chunkSize));
    i += chunkSize;
    chunkSize = (chunkSize === size1 ? size2 : size1);
  }
  
  return output;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...