Как разбить длинный массив на меньшие массивы с помощью JavaScript - PullRequest
64 голосов
/ 01 сентября 2011

У меня есть массив электронных писем (это может быть только 1 электронное письмо или 100 электронных писем), и мне нужно отправить массив с запросом ajax (что я знаю, как сделать), но я могу только отправитьмассив, который содержит 10 или менее электронных писем.Поэтому, если существует оригинальный массив из 20 электронных писем, мне нужно будет разделить их на 2 массива по 10 в каждом.или если в исходном массиве 15 электронных писем, то 1 массив из 10 и другой массив из 5. Я использую jQuery, что будет лучшим способом сделать это?

Ответы [ 16 ]

1 голос
/ 23 мая 2017

Вот один простой лайнер

var segment = (arr, n) => arr.reduce((r,e,i) => i%n ? (r[r.length-1].push(e), r)
                                                    : (r.push([e]), r), []),
        arr = Array.from({length: 31}).map((_,i) => i+1);
console.log(segment(arr,7));
1 голос
/ 18 апреля 2017

Другая реализация, использующая Array.reduce (я думаю, что отсутствует только одна!):

const splitArray = (arr, size) =>
{
    if (size === 0) {
        return [];
    }

    return arr.reduce((split, element, index) => {
        index % size === 0 ? split.push([element]) : split[Math.floor(index / size)].push(element);
        return split;
    }, []);
};

Как и многие другие решения выше, это неразрушающее.Возврат пустого массива, когда размер равен 0 - это просто соглашение.Если блок if пропущен, вы получите сообщение об ошибке, которое может быть тем, что вы хотите.

1 голос
/ 29 марта 2016

Вы можете взглянуть на этот код. Просто и эффективно.

function chunkArrayInGroups(array, unit) {
var results = [],
length = Math.ceil(array.length / unit);

for (var i = 0; i < length; i++) {
    results.push(array.slice(i * unit, (i + 1) * unit));
}
 return results;
}

chunkArrayInGroups(["a", "b", "c", "d"], 2);
0 голосов
/ 08 апреля 2019

Более компактный:

const chunk = (xs, size) =>
  xs.map((_, i) =>
    (i % size === 0 ? xs.slice(i, i + size) : null)).filter(Boolean);
    
// Usage:
const sampleArray = new Array(33).fill(undefined).map((_, i) => i);

console.log(chunk(sampleArray, 5));
0 голосов
/ 26 февраля 2018
function chunkArrayInGroups(arr, size) {
    var newArr=[];

    for (var i=0; arr.length>size; i++){
    newArr.push(arr.splice(0,size));
    }
    newArr.push(arr.slice(0));
    return newArr;

}

chunkArrayInGroups([0, 1, 2, 3, 4, 5, 6], 3);
0 голосов
/ 27 июля 2016

Если вы хотите метод, который не изменяет существующий массив, попробуйте это:

let oldArray = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15];
let newArray = [];
let size = 3; // Size of chunks you are after
let j = 0; // This helps us keep track of the child arrays

for (var i = 0; i < oldArray.length; i++) {
  if (i % size === 0) {
    j++
  }
  if(!newArray[j]) newArray[j] = [];
  newArray[j].push(oldArray[i])
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...