JavaScriptで配列をネストした配列(サブ配列)に変換する方法
今回は、数値の配列と数値 n を受け取る関数を作成します。ただし、n は配列内のどの要素以上であるものとします。この関数の役割は、連続する要素の合計が n を超えた時点で配列をサブ配列に分割することです。
処理のイメージ
たとえば、次のようなケースを考えてみましょう。
// 元の配列が次の場合: const arr = [2, 1, 2, 1, 1, 1, 1, 1]; // 数値 n が 4 であれば、出力は以下のようになります: const output = [ [ 2, 1 ], [ 2, 1, 1 ], [ 1, 1, 1 ] ];
ご覧のとおり、各サブ配列内の要素の合計は n(= 4)を超えていません。最初の [2, 1] にさらに 2 を加えると合計が 5 となり n を超えるため、そこで配列が区切られているわけです。
コードの実装
それでは、この関数を実装してみましょう。ここでは Array.prototype.reduce() メソッドを使用し、アキュムレータとして「現在の累積合計(sum)」と「結果を格納する配列(res)」を管理しながら処理を進めます。
const arr = [2, 1, 2, 1, 1, 1, 1, 1];
const splitArray = (arr, num) => {
return arr.reduce((acc, val, ind) => {
let { sum, res } = acc;
if(ind === 0){
return {sum: val, res:[[val]]};
};
if(sum + val <= num){
res[res.length-1].push(val);
sum += val;
}else{
res.push([val]);
sum = val;
};
return { sum, res };
}, {
sum: 0,
res: []
}).res;
};
console.log(splitArray(arr, 4));
console.log(splitArray(arr, 5));コードのポイント
- reduce の初期値として、「現在の部分和 sum」と「結果配列 res」を持つオブジェクトを渡しています。
- 先頭要素(ind === 0)の場合は、res の最初のサブ配列としてその要素をセットして返します。
- sum + val が num 以下であれば、直前のサブ配列に要素を追加し、合計を更新します。
- 合計が n を超える場合は新しいサブ配列を作成し、sum をその要素でリセットします。
実行結果
コンソールには次のように出力されます。
[ [ 2, 1 ], [ 2, 1, 1 ], [ 1, 1, 1 ] ] [ [ 2, 1, 2 ], [ 1, 1, 1, 1, 1 ] ]
このように splitArray 関数を使えば、指定した合計値を超えない範囲で配列を柔軟にサブ配列へ分割できます。データのチャンク分割やグループ化など、さまざまな場面で応用できる便利なテクニックです。
-
JavaScriptで配列をセット(Set)に変換する方法|new Set()の使い方を解説
JavaScriptでは、new Set() コンストラクタを使うことで、配列を簡単にセット(Setオブジェクト)へ変換できます。セットは同じ値を自動的に1つだけ保持する性質を持つため、配列から重複した要素を取り除きたい場合にも非常に便利です。 配列をセットに変換するサンプルコード 以下は、ボタンをクリックすると配列がセットに変換されて表示される、完全なHTMLサンプルです。 <!DOCTYPE html> <html lang=ja> <head> <meta charset=UTF-8 /> <meta name=viewport co
-
JavaScriptで辞書(連想配列)をオブジェクトのリストに変換する方法
JavaScriptでは、キーと値のペアを持つ「辞書」のようなオブジェクトを、Object.values()メソッドを使うことで簡単にオブジェクトの配列(リスト)へ変換できます。以下に具体的なサンプルコードを示します。 サンプルコード <!DOCTYPE html> <html lang=ja> <head> <meta charset=UTF-8 /> <meta name=viewport content=width=device-width, initial-scale=1.0 /> <title>Document&