JS Разбить массив на X порций, затем Y порций и т. Д. - PullRequest
0 голосов
/ 12 октября 2019

Как именно я могу разбить массив на 6 частей, затем на 3 части, затем на 6 частей, затем на 3 части и так далее?

Итак, скажем, у меня есть этот набор данных:

const datasaet = [
  { text: 'hi1' },
  { text: 'hi2' },
  { text: 'hi3' },
  { text: 'hi4' },
  { text: 'hi5' },
  { text: 'hi6' },
  { text: 'hi7' },
  { text: 'hi8' },
  { text: 'hi9' },
  { text: 'hi10' },
  { text: 'hi11' },
  { text: 'hi12' },
  { text: 'hi13' },
  { text: 'hi14' },
  { text: 'hi15' },
  { text: 'hi16' },
]

и мне нужно разделить его на массив следующим образом:

const expected = [
  [
    { text: 'hi1' },
    { text: 'hi2' },
    { text: 'hi3' },
    { text: 'hi4' },
    { text: 'hi5' },
    { text: 'hi6' },
  ],
  [
    { text: 'hi7' },
    { text: 'hi8' },
    { text: 'hi9' },
  ],
  [
    { text: 'hi10' },
    { text: 'hi11' },
    { text: 'hi12' },
    { text: 'hi13' },
    { text: 'hi14' },
    { text: 'hi15' },
    { text: 'hi16' },
  ]
]

По сути, я делаю массив на 6 частей, если это событие, и 3 части, если он нечетный.

Однако я не знаю точно, как это сделать. Моя текущая попытка выглядит следующим образом, я могу отлично разбить ее на 6 частей, но как мне сделать следующие 3, а затем следующие 6 и так далее:

const grouped = datasaet.reduce(
  (initital: any[], current, index, items) => {
    const isFirstOfSix = index % 6 === 0
    if (isFirstOfSix) {
      const nextSix = items.slice(index, index + 6)
      initital.push(nextSix)
    }

    return initital
  },
  []
) 

Ответы [ 2 ]

1 голос
/ 12 октября 2019

Вы можете создать копию массива (чтобы избежать изменения оригинала), затем разделять элементы до тех пор, пока он не станет пустым, проверяя и переключая логическое значение, указывающее, удалять ли 6 или 3 элемента в текущей итерации:

const datasaet = [
  { text: 'hi1' },
  { text: 'hi2' },
  { text: 'hi3' },
  { text: 'hi4' },
  { text: 'hi5' },
  { text: 'hi6' },
  { text: 'hi7' },
  { text: 'hi8' },
  { text: 'hi9' },
  { text: 'hi10' },
  { text: 'hi11' },
  { text: 'hi12' },
  { text: 'hi13' },
  { text: 'hi14' },
  { text: 'hi15' },
  { text: 'hi16' },
]

const tempArr = datasaet.slice();
const output = [];
let removeSix = true;
while (tempArr.length) {
  output.push(tempArr.splice(0, removeSix ? 6 : 3));
  removeSix = !removeSix;
}
console.log(output);
0 голосов
/ 12 октября 2019

Вы можете создать функцию, которая принимает массив и массив размеров чанка. Функция выполняет итерацию массива, циклически изменяет размеры чанков и использует срез, чтобы взять текущий размер чанка из исходного массива:

const chunks = (arr, chunkSize) => {
  const result = [];
  
  let current = -1;

  for (let i = 0; i < arr.length; i += chunkSize[current]) {
    current = (current + 1) % chunkSize.length;
    
    result.push(arr.slice(i, i + chunkSize[current]));
  }

  return result;
}

const dataset = [{"text":"hi1"},{"text":"hi2"},{"text":"hi3"},{"text":"hi4"},{"text":"hi5"},{"text":"hi6"},{"text":"hi7"},{"text":"hi8"},{"text":"hi9"},{"text":"hi10"},{"text":"hi11"},{"text":"hi12"},{"text":"hi13"},{"text":"hi14"},{"text":"hi15"},{"text":"hi16"}];

const result = chunks(dataset, [6, 3]);

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...