Разбить массив на куски - PullRequest
       161

Разбить массив на куски

396 голосов
/ 14 декабря 2011

Допустим, у меня есть массив Javascript, который выглядит следующим образом:

["Element 1","Element 2","Element 3",...]; // with close to a hundred elements.

Какой подход был бы уместен для разбиения массива на множество меньших массивов, скажем, максимум с 10 элементами?

Ответы [ 46 ]

0 голосов
/ 23 сентября 2018

Вот версия с хвостовой рекурсией и деструктуризацией массива.

Это далеко не самое быстрое исполнение , но я просто удивлен, что js может сделать это сейчас. Даже если он не оптимизирован для этого: (

const getChunks = (arr, chunk_size, acc = []) => {
    if (arr.length === 0) { return acc }
    const [hd, tl] = [ arr.slice(0, chunk_size), arr.slice(chunk_size) ]
    return getChunks(tl, chunk_size, acc.concat([hd]))
}

// USAGE
const my_arr = [1,2,3,4,5,6,7,8,9]
const chunks = getChunks(my_arr, 2)
console.log(chunks) // [[1,2],[3,4], [5,6], [7,8], [9]]
0 голосов
/ 21 июля 2018

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

    function chunk(array, size) {
      let resultArray = [];
      let chunkSize = array.length/size;
      for(i=0; i<chunkSize; i++) {
        resultArray.push(array.splice(0, size));
      }
    return console.log(resultArray);
    }
    chunk([1,2,3,4,5,6,7,8], 2);

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

    let clonedArray = [...OriginalArray]
0 голосов
/ 03 июля 2018

Попробуйте это:

var oldArray =  ["Banana", "Orange", "Lemon", "Apple", "Mango", "Banana", "Orange", "Lemon", "Apple", "Mango", "Banana", "Orange", "Lemon", "Apple", "Mango", "Banana", "Orange", "Lemon", "Apple", "Mango", "Banana", "Orange", "Lemon", "Apple", "Mango"];

var newArray = [];

while(oldArray.length){
    let start = 0;
    let end = 10;
    newArray.push(oldArray.slice(start, end));
    oldArray.splice(start, end);
 }
 
 console.log(newArray);
0 голосов
/ 11 февраля 2017

Она - простое решение, использующее решение @Blazemonger

function array_chunk(arr, size){
    // initialize vars
    var i,
    j = arr.length,
    tempArray = [];
    // loop through and jump based on size
    for (i=0; i<j; i+=size) {
        // slice chunk of arr and push to tempArray
        tempArray.push(arr.slice(i,i+size));
    }
    // return temp array (chunck)
    return tempArray
}

Это дало мне возможность работать, надеюсь, это поможет кому-то еще.:)

0 голосов
/ 09 мая 2017

Вот еще одно решение с методом lower () , хотя и немного отличающееся от других примеров.Надеюсь, мое объяснение немного яснее.

var arr = [0, 1, 2, 3, 4, 5, 6, 7];
var chunkSize = 3;

arr = arr.reduce((acc, item, idx) => {
  let group = acc.pop();
  if (group.length == chunkSize) {
    acc.push(group);
    group = [];
  }
  group.push(item);
  acc.push(group);
  return acc;
}, [[]]);

console.log(arr); //Prints [[0, 1, 2], [3, 4, 5], [6, 7]]

Объяснение

Мы называем редуктор, который для каждого элемента в массиве получает последний элемент аккумулятора с pop().Помните, что этот элемент является массивом, который группирует до chunkSize количества элементов ( 3 в этом примере ).

Если и только если эта группа имеет длину массива, равнуюchunksize нам нужно заново вставить группу обратно в аккумулятор и создать новую группу.

Затем мы помещаем ток item в наш массив group (, который может уже содержать 0, 1 или 2 пункта из предыдущих шагов ).С текущим item, вставленным в group, нам нужно повторно вставить group обратно в большую коллекцию.

Процесс будет повторяться, пока мы не повторим все элементы в arr.

Обратите внимание, что мы также предоставили редуктору начальное значение пустого массива внутри массива с [[]].

0 голосов
/ 09 октября 2015
function chunk(arr, size) {
  var tempAr = [];
  var j=  0;
  for(var i =0 ;i<arr.length;i++){ 
    if(j==size || j==0){  
     tempAr.push(arr.slice(i,(i+size)));
      j=0;
      }j++;
  }
  return tempAr;
}
...