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

JavaScriptで特殊な並び順の配列からターゲット文字列のインデックスを検索する方法


問題概要

ここで考えるのは、検索対象となる単語 target と単語の配列を受け取るJavaScript関数です。配列内の単語はすべてユニークであり、ターゲットが必ず含まれていることが保証されています。また、配列は以下の3つの基準によってソートされています。

  • 文字数が短い順(昇順)
  • 大文字の数が多い順(降順)
  • 条件が同じ場合は自然順(通常の辞書順)

関数の目的は、この一見「奇妙」な並び順の配列の中からターゲットを探し出し、そのインデックス(0始まり)を返すことです。ターゲットは必ず存在するため、見つからないケースを考慮する必要はありません。

解き方のポイント

ソートのルールが複雑に見えるため難しく感じられますが、実はシンプルな線形探索で十分です。JavaScriptでは Array.prototype.indexOf() メソッドを使えば、たった1行でインデックスを取得できます。

コード例

const arr = ['cP', 'rE', 'sZ', 'am', 'bt', 'ev', 'hq', 'rx', 'yi', 'akC', 'nrcVpx', 'iKMVqsj'];
const target = 'akC';

const findTarget = (arr = [], target = '') => {
  const index = arr.indexOf(target);
  return index;
};

console.log(findTarget(arr, target));

実行結果

コンソールには以下が出力されます。

9

配列 arr の中で 'akC' は先頭から10番目の要素、すなわちインデックス9の位置にあるため、正しく 9 が返されます。

別の実装方法

findIndex() メソッドとコールバック関数を組み合わせれば、より柔軟な検索条件への拡張も容易になります。

const findTarget = (arr, target) =>
  arr.findIndex((word) => word === target);

パフォーマンスに関する補足

配列サイズが非常に大きい場合は、線形探索(O(n))の代わりに二分探索(O(log n))を検討する価値があります。ただし、その場合には上記の3段階のソートルールに従った比較関数を自前で実装する必要があります。小規模〜中規模の配列であれば、シンプルな indexOf() の利用が最も読みやすく実用的な選択といえるでしょう。

  1. JavaScriptで配列内の要素を検索する方法|indexOf・find・findIndexの使い方を解説

    JavaScriptには、配列から要素を検索するための便利なメソッドが多数用意されています。この記事では、基本的なindexOfから、条件を指定して検索できるfind()やfindIndex()まで、実例を交えながらわかりやすく解説します。 indexOf():最も基本的な検索メソッド indexOfは、配列全体を先頭から順に走査し、指定した要素が見つかればそのインデックス(位置)を返します。見つからなかった場合は -1 を返します。 サンプルコード let people = [Harry, Martha, John, Sam]; console.log(people.indexOf(John

  2. JavaScriptで文字列を検索する方法【search()メソッドの使い方を解説】

    JavaScriptで文字列を検索する方法 JavaScriptで文字列の中から特定の文字列を探すには、search()メソッドを使用します。このメソッドは、引数に渡した文字列(または正規表現)が対象の文字列内で最初に一致した位置(インデックス)を返し、見つからなかった場合は -1 を返します。 以下は、JavaScriptで文字列を検索するサンプルコードです。 サンプルコード <!DOCTYPE html> <html lang="en" > <head> <meta charset="UTF-8" />