配列のindexOf関数とfindIndex関数の違い


125

2つの関数indexOfの違いと配列内のインデックスの検索で混乱しています。

ドキュメントは言う

findIndex-述語がtrueである配列の最初の要素のインデックスを返し、それ以外の場合は-1を返します。

そして

indexOf-配列内で最初に出現する値のインデックスを返します。


4
違いは、関数を引数として取る(値全体ではなく特定の部分文字列を持つ値の最初の出現を探すなど、より高度な検索を可能にする)ことです。探しています。それは実際に悪い質問ではありません。説明なしの反対票は反対票でなければなりません。
Tim Consolazio 2017年

場合によっては、言語仕様(つまりECMA-262)から始めて、他の素材でギャップを埋めることが最善です:Array.prototype.indexOf(searchElement [、fromIndex]) vs Array.prototype.findIndex(predicate [、thisArg])
RobG 2017年

TimとRobGに感謝
Rahul Singh

回答:


194

主な違いは、これらの関数のパラメーターです。

  • Array.prototype.indexOf()期待する値を最初のパラメータとして。このため、プリミティブ型(文字列、数値、ブール値など)の配列でインデックスを検索することをお勧めします。

  • Array.prototype.findIndex()期待していたコールバックを最初のパラメータとして。これは、非プリミティブ型(オブジェクトなど)の配列でインデックスが必要な場合、または検索条件が単なる値よりも複雑な場合に使用します。

両方のケースの例については、リンクを参照してください。


4
どんなプリミティブ型がjsだろうと誰かが疑問に思っている場合、それらは文字列、数値、ブール値のようなものです。
ジョン・リー・

3
indexOfオブジェクトを見つけるために動作することに注意してください。値だけでなく単一のオブジェクトを受け入れ、値ではなく等価で比較するという区別をつけることが重要です。Mozillaのドキュメントごと: 説明をindexOf() compares searchElement to elements of the Array using strict equality (the same method used by the === or triple-equals operator). 修正してfindIndex、「または、検索条件が単一の値または参照よりも複雑である」という肢だけを含めて、元々私を混乱させたため、これを修正してください。ありがとう!
brokenalarms

2
@brokenalarmsこれは真実ですが、配列内の実際のオブジェクトへの参照がある場合のみです。たとえば、オブジェクトは同じように見えますが、同じではありませんが、[{a:1}].indexOf({a:1})戻ります-1。混乱を招く可能性があるため、この情報が回答に役立つかどうかはわかりません。正確な言語動作について詳しく知る必要がある場合は、仕様を読んでください。
str

さらに、indexOf()は、厳密な等価性を使用してsearchElementを配列の要素と比較します(===または三重等号演算子で使用されるのと同じメソッド)。
immirza

・ワースは、しかし、注目に.indexOf(NaN)常に戻ります-1ので、NaN==NaN常にありますfalseNaN ですので、プリミティブ型がtypeof NaNあるnumberので、あるnullundefined私は言って避けるために、これを修正しますので、indexOfプリミティブ型に作品を
マタイ

13

FindIndexは、述語に一致する最初の要素を検索する場合に役立ちます。W3Cの例では、顧客の年齢が18歳以上の場合に数字と一致があります。

var ages = [3, 10, 18, 20];

function checkAdult(age) {
    return age >= 18;
}

console.log(ages.findIndex(checkAdult));

コンソール:

2

ArrayのindexOf関数で正確な要素インデックスを見つけることができますが、述語を渡すことはできません。特定の要素を見つけたい場合は、より高速です。

var ages = [3, 10, 18, 20];
console.log(ages.indexOf(10));

戻り値:

1

インデックスのカウントは0から始まるため、最初の要素のインデックスは0です。


4

主な違いは、これらの関数のパラメーターです。

-> Array.prototype.indexOf()

   var fruits = ["Banana", "Orange", "Apple", "Mango"];
   var a = fruits.indexOf("Apple");
   The result of a will be: 2

-> Array.prototype.findIndex()

       var ages = [3, 10, 18, 20];

       function checkAdult(age) {
        return age >= 18;
       }

       function myFunction() {
         document.getElementById("demo").innerHTML = 
         ages.findIndex(checkAdult);
       }

       The result will be: 2

4

あなたも使うことができますincludes

[1, 2, 3].includes(2);      // true
[1, 2, 3].includes(4);      // false
[1, 2, 3].includes(3, 3);   // false

しかし、私はindexOf方法を好みます:

var vals = [ "foo", "bar", 42, "baz" ];
if (~vals.indexOf( 42 )) {
  // found it!
}

1
IEのポリフィルも必要
MJB

indexOf同様にはるかに高速です。
eozzy

4

もう1つの違いは、findIndex()を使用すると、ユーザーが関数適用して、テストに合格した配列の要素を見つけることができることです。

しかし、indexOf()演算子では同じことが当てはまりません。ユーザーは、特定の要素が配列に存在するかどうかを確認できます。


3

シンプル-どのような配列構造を使用していますか?

  • オブジェクトの配列の場合、findIndex();
  • そうでなければ、indexOf()

オブジェクトの配列のインデックスを、「オレンジ」のキーで検索したい。

let fruits = [
   { type: "Apple", quantity: 9 },
   { type: "Banana", quantity: 2},
   { type: "Orange", quantity: 8},
   { type: "Pear", quantity: 777}
];

let myIndex = fruits.findIndex(fruit => fruit.type === "Orange"); // Returns 2.

単純な配列でインデックスを見つけたい」

let fruits = [ "Apple", "Banana", "Pear", "Orange"];

let index = fruits.indexOf("Orange"); // Returns 3.

0

以下のコードを試すことができます:-

let city = ['Delhi', 'mumbai']
const a = city.findIndex((item) => 
item.toLowerCase()==='delhi')
console.log(a) // returns 0

let c = city.indexOf('mumbai') // returns 1
console.log(c)

このコードは「初心者」にとって非常にシンプルで理解しやすいため、このコードには説明は必要ないと思います。また、初心者の方は複雑なコードが理解しづらいので、シンプルにしています。だから私の意図を理解せずに低品質と言ってはいけません。
Gulsan Borbhuiya

システムによってマークされた低品質のものが見つかりませんでした。
Gulsan Borbhuiya
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.