JavaScript
 Computer >> コンピューター >  >> プログラミング >> JavaScript

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を代入した場合とは内部的に扱いが異なり、不要な要素を持たない分、メモリ効率の面で有利になることもあります。座標データやマトリクスの一部だけに値があるようなケースでは、この手法が非常に有効です。


  1. JavaScriptで配列の配列をオブジェクトに変換する方法

    はじめにJavaScriptでは、「キーと値のペア」を格納した配列の配列(ネストされた配列)を、扱いやすいオブジェクトへ変換したい場面がよくあります。本記事では、その具体的な実装方法をわかりやすく解説します。例として、あるクリケット選手の成績データを表す次のような配列の配列を想定してみましょう。const arr = [     [Name, V Kohli],     [Matches, 13],     [Runs, 590],    &nb

  2. JavaScriptで2つのソート済み配列を1つのソート済み配列にマージする方法

    問題2つの数値のソート済み配列を受け取り、両方の配列のすべての要素を新しい配列へマージし、同じ順序でソートされた状態の新しい配列として返すJavaScript関数を作成する必要があります。この操作はマージソートの中核となる処理でもあり、効率的なアルゴリズム設計における重要なテクニックです。concat()後にsort()する方法もありますが、すでにソート済みの配列同士をマージする場合は、両端ポインタ(Two Pointers)を使ったアプローチの方がはるかに効率的です。解決のアプローチ:Two Pointers(双方向ポインタ)基本的な考え方は以下の通りです。インデックス変数 i と j を用