96

nJavaScript 配列をサイズのチャンクに分割する必要があります。

例: この配列が与えられた場合

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

anが 4 の場合、出力は次のようになります。

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

この問題に対する純粋な JavaScriptソリューションを認識していますが、すでにLodashを使用しているため、Lodash がこれに対してより良いソリューションを提供するかどうか疑問に思っています。

編集:

アンダースコア ソリューションがどれほど遅いかを確認するために、 jsPerf テストを作成しました。

4

5 に答える 5

145

lodash のチャンクを見てみましょう: https://lodash.com/docs#chunk

const data = ["a1", "a2", "a3", "a4", "a5", "a6", "a7", "a8", "a9", "a10", "a11", "a12", "a13"];
const chunks = _.chunk(data, 3);
console.log(chunks);
// [
//  ["a1", "a2", "a3"],
//  ["a4", "a5", "a6"],
//  ["a7", "a8", "a9"],
//  ["a10", "a11", "a12"],
//  ["a13"]
// ]
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.min.js"></script>

于 2015-03-16T15:50:30.837 に答える
90

アンダースコアベースのソリューションの場合、これを試してください:

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);

チェーン ラッパー メソッドを使用すると、次のように 2 つのステートメントを組み合わせることができます。

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();
于 2011-12-19T20:02:17.913 に答える
1

これを試してみると、はるかに実用的です (たとえば、各サブ配列のコンテナーになるアイテムの量に基づいて配列を分割する場合)。

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);
于 2015-02-07T11:09:33.113 に答える