Есть ли хороший способ ES6 разделить массив на несколько массивов, при этом каждый элемент в исходном массиве входит в следующий целевой массив и повторяется по всему исходному массиву?

Например

source = [1,2,3,4,5,6,7,8,9,10,11,12,13]

Если целевых массивов было 2, я хотел бы получить вывод

output =  { 
 [1,3,5,7,9,11,13],
 [2,4,6,8,10,12]
}

Если целевых массивов было 3, я хотел бы получить вывод

output =  { 
 [1,4,7,10,13],
 [2,5,8,11],
 [3,6,9,12]
}
1
Gordon Hickley 26 Апр 2020 в 19:31

2 ответа

Используя reduce, это можно сделать. Вот решение для size целевого массива:

[1,2,3,4,5,6,7,8,9,10,11,12,13].reduce(function (acc, curr, idx) {
  acc[idx % size] ? acc[idx % size].push(curr) : acc[idx % size] = [curr];
  return acc
}, []);
2
VPaul 26 Апр 2020 в 17:10

Вы можете сделать что-то вроде этого

  1. Получи делитель и остаток
  2. создать массив длины n со значениями `делитель + 1 (для первого оставшегося числа элементов) ИЛИ 0 (мы используем это для равномерного распределения дополнительных элементов по начальным элементам)
  3. Цикл по массиву, который мы создали выше, нарезать массив и добавить в окончательный массив
let source = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]

let divideInParts = (arr, number) => {
  let divisor = Math.floor(arr.length / number)
  let remainder = arr.length % number
  let tempArr = Array.from({length: number}, (_,i)=> divisor +( remainder-- > 0 ))
  let start = 0
  let final = tempArr.map((v,i)=>{
    let val = i === 0 ? arr.slice(0, v) : arr.slice(start, start + v)
    start += v
    return val
  })
  return final
}

console.log(divideInParts(source, 2))
console.log(divideInParts(source, 3))
console.log(divideInParts(source, 13))
console.log(divideInParts(source, 10))
0
Code Maniac 26 Апр 2020 в 17:39