JavaScriptで配列を反転せずに要素の逆インデックスを取得する方法
はじめに
本記事では、配列を実際に反転させることなく、指定した要素が「逆順の配列」の中でどのインデックス位置に該当するかを求める関数を、JavaScriptで実装する方法を解説します。
要件の整理
- 関数は、文字列または数値のリテラルを含む配列を第一引数として受け取り、検索対象の文字列または数値を第二引数として扱います。
- 検索対象の値が配列内に存在しない場合は -1 を返します。
- 値が存在する場合は、配列を逆順に並べ替えた場合にその要素が占めることになるインデックスを返します。ただし、実際に配列を反転してはいけません。
- 最後に、この関数を
Array.prototypeオブジェクトにアタッチし、すべての配列から呼び出せるようにします。
動作イメージ
たとえば、次のような呼び出しを考えてみましょう。
[45, 74, 34, 32, 23, 65].reversedIndexOf(23);
// 1 を返す:配列が逆順になった場合、23 はインデックス 1 の位置に配置されるため
元の配列 [45, 74, 34, 32, 23, 65] を仮想的に反転すると [65, 23, 32, 34, 74, 45] となり、23 はインデックス 1 に移動します。
コード例
以下が実装コードです。
const arr = [45, 74, 34, 32, 23, 65];
const num = 23;
const reversedIndexOf = function(num) {
const { length } = this;
const ind = this.indexOf(num);
// 要素が見つからない場合は -1 を返す
if (ind === -1) {
return -1;
}
// 逆順のインデックス = 配列長 − 正順のインデックス − 1
return length - ind - 1;
};
Array.prototype.reversedIndexOf = reversedIndexOf;
console.log(arr.reversedIndexOf(num));
ロジックのポイント
この関数の核となるのは 「length - ind - 1」 という計算式です。indexOf() で取得できる正順のインデックスに対してこの式を適用すると、配列の両端から数えた位置が対称になるため、反転時のインデックスが一発で求まります。
たとえば配列長が 6、要素の正順インデックスが 4 の場合、逆順インデックスは 6 − 4 − 1 = 1 となります。これは「先頭から5番目にある要素は、末尾から数えると2番目(インデックス1)になる」という直感的な関係とも一致しています。
出力結果
上記のコードを実行すると、コンソールには次のように出力されます。
1
まとめ
Array.prototype を拡張することで、任意の配列に対して直接 reversedIndexOf() を呼び出せるようになります。配列のコピーを作成したり reverse() を実行したりしないため、元の配列を一切変更せず、余分なメモリ消費もなく目的のインデックスを取得できます。ただし、プロトタイプ拡張を行う際は、既存ライブラリや他のコードとの名前の衝突に注意してください。
-
JavaScriptで配列を「2倍関係」を満たすように再配置できるか判定する方法
問題数値の配列 arr を第一引数(唯一の引数)として受け取るJavaScript関数を作成する必要があります。配列 arr の長さは必ず偶数であると保証されています。この関数は、すべての 0 <= i < arr.length / 2 に対して arr[2 * i + 1] = 2 * arr[2 * i] という条件を満たすように並べ替えられる場合にのみ true を返し、そうでなければ false を返す必要があります。たとえば、関数への入力が次の場合を考えてみましょう。const arr = [4, -2, 2, -4];このとき、期待される出力は次のとおりです。const
-
【JavaScript】配列の中で左右の合計が等しくなる中央インデックス(ピボットインデックス)を見つける方法
問題数値の配列 arr が与えられたとき、「あるインデックスより左側にあるすべての要素の合計」と「そのインデックスより右側にあるすべての要素の合計」が等しくなる位置(中央インデックス/ピボットインデックス)を求める JavaScript 関数を作成します。該当するインデックスが複数存在する場合は、最初に見つかったものを返し、存在しない場合は -1 を返すのが一般的です。たとえば、次のような入力を考えます。入力const arr = [1, 7, 3, 6, 5, 6];出力const output = 3;出力の解説インデックス 3 の要素は nums[3] = 6 です。この要素の左側にある