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

JavaScriptで配列のリーダー要素を抽出する方法

リーダー要素とは

数値の配列において、その要素より右側にあるすべての要素よりも大きい場合、その要素は「リーダー」と呼ばれます。つまり、配列の右端に向かって見たとき、自分より大きな数が一つも存在しない要素がリーダー要素です。

本記事では、数値の配列を受け取り、このリーダー要素の条件を満たすすべての要素を含む部分配列を返すJavaScript関数を紹介します。

具体例

例えば、以下の入力配列を考えてみましょう。

入力配列:
[23, 55, 2, 56, 3, 6, 7, 1]

期待される出力:
[56, 7, 1]

出力が [56, 7, 1] となる理由を見てみましょう。56はその右側にあるすべての要素(3、6、7、1)より大きいためリーダーです。7は右側の要素(1)より大きいためリーダーで、最後の要素1も定義上リーダーとなります。

実装コード

この関数は、reduceRight() メソッドを使うと効率的に実装できます。reduceRight() は配列を右から左へ処理するため、「現在までの最大値」と比較しながらリーダー要素を順番に判定していくのに適しています。

const arr = [23, 55, 2, 56, 3, 6, 7, 1];

const leaderArray = arr => {
  const creds = arr.reduceRight((acc, val) => {
    let { max, res } = acc;
    if(val > max){
      res.unshift(val);
      max = val;
  };
    return { max, res };
  }, {
    max: -Infinity,
    res: []
  })
  return creds.res;
};

console.log(leaderArray(arr));

コードの仕組み

  • 初期値: アキュムレータとして max: -Infinity(負の無限大)と空の結果配列 res を設定します。
  • 右から左へ走査: reduceRight() を使い、各要素を現在の最大値 max と比較します。
  • リーダー判定: 要素が max より大きければ、それはリーダー要素なので unshift() で結果配列の先頭に追加し、max を更新します。

unshift() を使うことで、元の配列での出現順序(左から右)を保ったまま結果を組み立てられる点がポイントです。

実行結果

コンソールには次のように出力されます。

[56, 7, 1]

このアルゴリズムは配列を一度だけ走査するため、時間計算量は O(n) となり、大きな配列でも効率的に動作します。

  1. 【初心者向け】JavaScriptのreverse()メソッドで配列を逆順にする方法

    JavaScriptのreverse()メソッドは、配列の要素を元の順序と逆順に入れ替えるための便利な関数です。このメソッドを呼び出すと、配列の最初の要素が最後に、最後の要素が最初に移動し、配列全体が反転されます。reverse()メソッドの基本reverse()は配列そのものを変更する「破壊的メソッド」である点に注意してください。つまり、元の配列の順序が直接書き換えられます。元の配列を保持したい場合は、あらかじめslice()やスプレッド構文([...arr])などでコピーを作成してからreverse()を使用するのがおすすめです。サンプルコード以下は、ボタンをクリックすると配列の要素が逆順

  2. JavaScriptにおける配列の分割代入(Destructuring)の基本と使い方

    分割代入(Destructuring)とは、配列から値を取り出して個別の変数に展開するための構文です。ES2015(ES6)で導入されたこの機能を使うと、配列の各要素を簡潔かつ読みやすく変数に割り当てることができます。 配列の分割代入のサンプルコード 以下は、JavaScriptで配列の分割代入を行うコード例です。 <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8" /> <meta name="viewport&quo