Разбить массив JavaScript на куски, используя Underscore.js - PullRequest
70 голосов
/ 19 декабря 2011

Мне нужно разбить массив JavaScript на куски размером n.

Например: данный массив

["a1", "a2", "a3", "a4", "a5", "a6", "a7", "a8", "a9", "a10", "a11", "a12", "a13"]

и n равно 4, вывод должен быть таким:

[ ["a1", "a2", "a3", "a4"],
  ["a5", "a6", "a7", "a8"],
  ["a9", "a10", "a11", "a12"],
  ["a13"]
]

Я знаю о чистом JavaScript решениях для этой проблемы, но так как я уже использую Underscore.js Мне интересно, если подчеркивание обеспечивает лучшее решение для этого.

Edit:

Я создал jsPerf test , чтобы проверить, насколько медленнее решение для подчеркивания.

Ответы [ 5 ]

95 голосов
/ 16 марта 2015

Взгляните на lodash ' chunk : https://lodash.com/docs#chunk

var data = ["a1", "a2", "a3", "a4", "a5", "a6", "a7", "a8", "a9", "a10", "a11", "a12", "a13"];
_.chunk(data, 3); 
// [
//  ["a1", "a2", "a3"],
//  ["a4", "a5", "a6"],
//  ["a7", "a8", "a9"],
//  ["a10", "a11", "a12"],
//  ["a13"]
// ]
90 голосов
/ 20 декабря 2011

Для решения на основе Underscore попробуйте это:

var data = ["a1", "a2", "a3", "a4", "a5", "a6", "a7", "a8", "a9", "a10", "a11", "a12", "a13"];
var n = 3;
var lists = _.groupBy(data, function(element, index){
  return Math.floor(index/n);
});
lists = _.toArray(lists); //Added this to convert the returned object to an array.
console.log(lists);

Используя метод цепочки, вы можете объединить два оператора, как показано ниже:

var data = ["a1", "a2", "a3", "a4", "a5", "a6", "a7", "a8", "a9", "a10", "a11", "a12", "a13"];
var n = 3;
var lists = _.chain(data).groupBy(function(element, index){
  return Math.floor(index/n);
}).toArray()
.value();
4 голосов
/ 06 июня 2018

Underscore поддерживает _. Chunk () изначально с версии 1.9.0.

let data = ["a1", "a2", "a3", "a4", "a5", "a6", "a7", "a8", "a9", "a10", "a11", "a12", "a13"];
_.chunk(data, 4);
// [
//   ["a1", "a2", "a3", "a4"],
//   ["a5", "a6", "a7", "a8"],
//   ["a9", "a10", "a11", "a12"],
//   ["a13"]
// ]
4 голосов
/ 27 октября 2015

Возможно более простое выражение:

    _.range(coll.length / n).map(i => coll.slice(i * n, (i + 1) * n))
0 голосов
/ 07 февраля 2015

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

function chunk(arr, start, amount){
    var result = [], 
        i, 
        start = start || 0, 
        amount = amount || 500, 
        len = arr.length;

    do {
        //console.log('appending ', start, '-', start + amount, 'of ', len, '.');
        result.push(arr.slice(start, start+amount));
        start += amount;

    } while (start< len);

    return result;
};

и использование вваш случай:

var arr = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17],
    chunked = chunk(arr, 0, Math.floor(arr.length/3)); //to get 4 nested arrays

console.log(chunked);

и другой случай:

var arr = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17],
    chunked = chunk(arr, 0, 3); // to get 6 nested arrays each containing maximum of 3 items

console.log(chunked);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...