Dizinin indexOf ve findIndex işlevi arasındaki fark


126

Bir dizide indexOf ile IndexOf işlevini bulmak arasındaki fark arasında kafam karıştı.

Belgeler diyor ki

findIndex - Doğruluğun doğru olduğu dizideki ilk öğenin dizinini, aksi takdirde -1 değerini döndürür.

ve

indexOf - Bir dizideki bir değerin ilk oluşumunun dizinini döndürür.


4
Bence aradaki fark, bir kişinin argüman olarak bir işlevi alması (daha karmaşık bulguları mümkün kılmak, örneğin bir değerin yalnızca tüm değer yerine belirli bir alt dizgiye sahip ilk oluşumunu aradığınız gibi), yalnızca sizin değerini alır. arıyoruz. Aslında kötü bir soru değil. Açıklama yapılmadan olumsuz oylar aşağı oylanabilir olmalıdır.
Tim Consolazio

Bazen en iyisi, dil spesifikasyonuyla (yani ECMA-262) başlamak ve diğer materyallerle boşlukları doldurmaktır: Array.prototype.indexOf (searchElement [, fromIndex]) - Array.prototype.findIndex (yüklem [, thisArg]) .
RobG

Teşekkürler Tim ve RobG
Rahul Singh

Yanıtlar:


195

Temel fark, bu işlevlerin parametreleridir:

  • Array.prototype.indexOf()ilk parametre olarak bir değer bekler . Bu, dizini ilkel tür dizilerinde (dize, sayı veya boole gibi) bulmayı iyi bir seçim haline getirir .

  • Array.prototype.findIndex()ilk parametre olarak bir geri arama bekler . İlkel olmayan türlere (örneğin nesneler) sahip dizilerde dizine ihtiyacınız varsa veya bulma koşulunuz yalnızca bir değerden daha karmaşıksa bunu kullanın.

Her iki duruma ilişkin örnekler için bağlantılara bakın.


5
Birinin hangi ilkel türlerin js olduğunu merak etmesi durumunda, bunlar dize, sayı, boole gibi şeylerdir.
John Lee

3
Lütfen indexOfnesneleri bulmak için çalışacağını unutmayın . Sadece bir değeri değil, tek bir Nesneyi kabul ettiği ve değerle değil eşitlikle karşılaştırıldığı ayrımı yapmak önemlidir. Mozilla dokümanları için: indexOf() compares searchElement to elements of the Array using strict equality (the same method used by the === or triple-equals operator).findIndex Bunu düzeltmek için lütfen açıklamayı sadece "veya bulma koşulunuz tek bir değerden veya referansdan daha karmaşık" uzantısını içerecek şekilde değiştirin . Teşekkürler!
kırık alarmlar

2
@brokenalarms Bu doğrudur, ancak yalnızca dizideki gerçek bir nesneye başvurunuz varsa. Örneğin , nesne aynı görünse de (ama öyle değil) [{a:1}].indexOf({a:1})döndürür -1. Kafa karıştırıcı olabileceğinden, bu bilginin cevapta yardımcı olup olmadığından emin değilim. Tam dil davranışı hakkında daha fazla bilgiye ihtiyacınız varsa, spesifikasyonu okumalısınız.
str

Ayrıca, indexOf (), katı eşitlik (=== veya triple-equals operatörü tarafından kullanılan aynı yöntem) kullanarak searchElement öğesini Array öğeleriyle karşılaştırır.
immirza

Ancak bunun .indexOf(NaN)her zaman geri döneceğini belirtmek gerekir, -1çünkü NaN==NaNher zaman olur false. NaN olduğu , çünkü basit bir tür typeof NaNolduğunu numberve bu yüzden vardır nullve undefinedben dememek için bu değişiklik diye, indexOfilkel türleri hakkında eserler
Matthew

13

Bulunduğunuz yere uyan ilk öğeyi bulmak istiyorsanız FindIndex kullanışlıdır: W3C örneğinde, müşterinin yaşı 18'den büyükse veya 18'e eşitse sayılar ve eşleşmeler vardır.

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

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

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

konsol:

2

Array'in indexOf fonksiyonu ile tam bir eleman indeksi bulabilirsiniz, ancak bir yüklemi geçemezsiniz. Belirli bir öğeyi bulmak istiyorsanız daha hızlıdır:

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

İadeler:

1

Dizin sayımı 0'dan başlar, bu nedenle ilk öğe dizini 0'dır.


4

Temel fark, bu işlevlerin parametreleridir:

-> 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

Ayrıca şunları da kullanabilirsiniz includes:

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

ama indexOfyöntemi tercih ederim :

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

1
ayrıca, IE için bir çoklu dolgu gerektirir
MJB

indexOfçok daha hızlı.
eozzy

4

Diğer bir fark, kullanıcının findIndex () ile bazı işlevleri uygulayabilmesi ve dizide testi geçen öğeyi bulabilmesidir.

Ancak aynı durum indexOf () operatörü için geçerli değildir . Bir kullanıcı, belirli bir elemanın dizide var olup olmadığını kontrol edebilir.


4

Basit - Ne tür bir dizi yapısı kullanıyorsunuz?

  • Nesne dizisi ise, findIndex() ;
  • Aksi takdirde indexOf(),.

"Bir dizi nesnede " Turuncu "tuşuyla dizini bulmak istiyorum .

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.

"Dizini basit bir dizide bulmak istiyorum ".

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

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

0

Aşağıdaki kodları deneyebilirsiniz: -

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)

Bu kodun herhangi bir açıklama gerektirdiğini sanmıyorum çünkü bu kod bir 'acemi' için çok basit ve anlaşılması kolay görünüyor. Ayrıca, yeni başlayanlar karmaşık kodu anlamakta güçlük çekiyorlar, bu yüzden basitleştirdim. Bu yüzden lütfen niyetimi anlamadan düşük kaliteli söyleme.
Gulsan Borbhuiya

Sistem tarafından işaretlenmiş düşük kaliteli bir şey bulamadım.
Gulsan Borbhuiya
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.