JavaScriptで2次元配列をスパース配列に変換する方法
例として、次のような2次元配列があるとしましょう。
const arr = [
[3, 1],
[2, 12],
[3, 3]
];ここでの課題は、このような配列を引数として受け取るJavaScript関数を作成することです。
関数は、入力配列で指定されたインデックスの位置にのみ値を設定し、それ以外の要素はすべてundefinedで初期化された新しい2次元配列(スパース配列/疎な配列)を生成する必要があります。
したがって、上記の入力配列に対しては、次のような対応関係になります。
output[3][1] = 1; output[2][12] = 1; output[3][3] = 1;
そして、これら以外の要素はすべてundefinedになります。
最終的な出力イメージは以下のとおりです。
const output = [
undefined,
undefined,
[
undefined,
undefined,
undefined,
undefined,
undefined,
undefined,
undefined,
undefined,
undefined,
undefined,
undefined,
undefined,
1
],
[
undefined,
1,
undefined,
1
]
];コード例
実装コードは以下のとおりです。
const arr = [
[3, 1],
[2, 12],
[3, 3]
];
const map2D = (arr = []) => {
const res = [];
arr.forEach(el => {
res[el[0]] = res[el[0]] || [];
res[el[0]][el[1]] = 1;
});
return res;
};
console.log(map2D(arr));処理の流れを簡単に説明すると、forEachで各ペア([行, 列])を順番に取り出し、res[行] がまだ存在しない場合は空の配列で初期化してから、res[行][列] に 1 を代入しています。JavaScriptでは、まだ存在しないインデックスに値を代入すると、その間の要素が自動的に「空(empty)」として確保されるため、結果的にスパース配列が生成されます。
出力結果
コンソールへの出力は以下のようになります。
[
<2 empty items>,
[ <12 empty items>, 1 ],
[ <1 empty item>, 1, <1 empty item>, 1 ]
]このように、値が設定されていない部分は「empty item」として表示されます。明示的にundefinedを代入した場合とは内部的に扱いが異なり、不要な要素を持たない分、メモリ効率の面で有利になることもあります。座標データやマトリクスの一部だけに値があるようなケースでは、この手法が非常に有効です。
-
JavaScriptで配列の配列をオブジェクトに変換する方法
はじめにJavaScriptでは、「キーと値のペア」を格納した配列の配列(ネストされた配列)を、扱いやすいオブジェクトへ変換したい場面がよくあります。本記事では、その具体的な実装方法をわかりやすく解説します。例として、あるクリケット選手の成績データを表す次のような配列の配列を想定してみましょう。const arr = [ [Name, V Kohli], [Matches, 13], [Runs, 590], &nb
-
JavaScriptで2つのソート済み配列を1つのソート済み配列にマージする方法
問題2つの数値のソート済み配列を受け取り、両方の配列のすべての要素を新しい配列へマージし、同じ順序でソートされた状態の新しい配列として返すJavaScript関数を作成する必要があります。この操作はマージソートの中核となる処理でもあり、効率的なアルゴリズム設計における重要なテクニックです。concat()後にsort()する方法もありますが、すでにソート済みの配列同士をマージする場合は、両端ポインタ(Two Pointers)を使ったアプローチの方がはるかに効率的です。解決のアプローチ:Two Pointers(双方向ポインタ)基本的な考え方は以下の通りです。インデックス変数 i と j を用