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

【JavaScript】対応する負の値が配列内に存在する正の値だけを抽出して返す方法

本記事では、正と負の数値が混在する数値の配列を受け取り、対応する負の値が同じ配列内に存在する正の値だけを抽出して返すJavaScript関数の実装方法を解説します。

たとえば、次のような入力配列を考えてみましょう。

const arr = [1, 5, -3, -5, 3, 2];

この場合、期待される出力は以下のとおりです。

const output = [5, 3];

「5」と「3」は、それぞれ「-5」「-3」が配列内に存在するため結果に含まれます。一方、「1」と「2」には対応する「-1」「-2」が存在しないため、結果から除外されます。

実装コード

実際のコードは次のようになります。

const arr = [1, 5, -3, -5, 3, 2];

const findNumbers = (arr = []) => {
    const count = Object.create(null);
    const result = [];
    arr.forEach(el => {
        if (count[-el]) {
            result.push(Math.abs(el));
            count[-el]--;
            return;
        }
        count[el] = (count[el] || 0) + 1;
    });
    return result;
}

console.log(findNumbers(arr));

実行結果

コンソールに出力される結果は以下のとおりです。

[5, 3]

コードの仕組み

このアルゴリズムのポイントを整理すると、次の3つです。

  • Object.create(null) の活用: プロトタイプを持たないプレーンなオブジェクトを生成することで、組み込みプロパティ名とのキー衝突を防ぎ、安全にカウント管理を行えます。
  • 1回の走査で完結: 各要素について、符号を反転した値(-el)がすでに記録済みかどうかを確認します。存在していれば、その絶対値を結果配列に追加し、該当するカウントを減らします。
  • 未登場の要素を記録: 対応する負の値がまだ見つかっていない場合は、現在の要素をカウントオブジェクトに登録し、後続の要素との照合に備えます。

この手法なら配列全体を1度だけ走査すればよく、計算量はO(n)に抑えられます。二重ループで総当たり的に比較する方式(O(n²))と比べ、要素数の多い配列でも高速に動作するのが大きなメリットです。

  1. JavaScriptで配列内の整数の符号を反転させる方法

    問題JavaScriptで、正と負の整数が混在する配列を受け取る関数を書く必要があります。この関数は、配列内のすべての正の数を負の数に、すべての負の数を正の数に変換し、その結果の配列を返すものとします。なお、0の符号を反転しても0のままである点に注意してください。コード例以下が実際のコードです。 {     const res = [];     for(let i = 0; i < arr.length; i++){         

  2. JavaScriptで配列要素をそのインデックスでべき乗した値に変換する方法

    問題 数値の配列を受け取るJavaScript関数を作成する必要があります。この関数は、入力配列の各要素を、その要素の位置を示す0始まりのインデックスでべき乗し、新しい配列へと変換します。そして最終的に、この新しい配列を返します。 例えば、インデックス0にある要素は0乗(常に1)、インデックス3にある要素は3乗、というように各要素が処理されます。 実装のポイント ループで配列を走査しながら、各要素とそのインデックスを同時に取得する Math.pow() を使って「要素 ^ インデックス」を計算する 計算結果を結果配列の同じ位置に格納する なお、モダンなJavaScriptでは Math