配列をn個ずつの配列に分割して、それをまとめた配列を作る
公開:
更新:
前の記事『ブクログのブログパーツAPIを使ってスライドする本棚を作る』を書いたとき、配列をn個ずつの配列に分割して、それをまとめた配列を作る、という処理をやったのですが、そのときのメモです。
「1つの配列をn個ずつに分割したい」みたいなことをTwitterに書いたら、
@hell2uさんから破壊していいならn回shiftしてまとめたのを後ろに追加をループでいいんじゃないか
@GeckoTangさんからsliceしてpush
と言われたので、両方やってみました。
ちなみに、スライド本棚ではshift & pushと似たような処理にしました。
例として、以下の配列を使います。
var baseArr = ['AAA', 'BBB', 'CCC', ... 'XXX', 'YYY', 'ZZZ'];
これを3つずつの9個に分割したいと思います。 『jsdo.it』で作ってみました。 2020年1月6日追記:shift
してpush
(破壊的)var b = baseArr.length, // 26
cnt = 3, // いくつずつに分割するか
newArr = []; // 新しく作る配列
for(var i = 0; i < Math.ceil(b / cnt); i++) {
var arrEl = []; // newArr に追加していく配列
for(var j = 0; j < cnt; j++) {
var p = baseArr.shift(); // 元配列の先頭を取得して元配列から削除
if(!p) { break; } // この場合は'ZZZ'の次に来たらループを抜ける
arrEl.push(p); // arrElに取得した要素を追加
}
newArr.push(arrEl); // 作ったarrElをnewArrに追加
}
slice
してpush
(非破壊的)var b = baseArr.length, // 26
cnt = 3, // いくつずつに分割するか
newArr = []; // 新しく作る配列
for(var i = 0; i < Math.ceil(b / cnt); i++) {
var j = i * cnt;
var p = baseArr.slice(j, j + cnt); // i*cnt番目からi*cnt+cnt番目まで取得
newArr.push(p); // 取得したものをnewArrに追加
}
サンプル
console.log
使って分かりやすくしたつもりなので、Firebugとかで確認してみてください。
『jsdo.it』は2019年に閉鎖されましたので、コードをそのままデモページに移行しました。
1つの配列を任意の配列に分割