Bir nesne dizisinde indexOf yöntemi?

Nesneler içeren bir dizinin indeksini almak için en iyi yöntem nedir?

Bu senaryoyu hayal edin:

var hello = {
    hello: 'world',
    foo: 'bar'
};
var qaz = {
    hello: 'stevie',
    foo: 'baz'
}

var myArray = [];
myArray.push(hello,qaz);

Şimdi hello özelliği 'stevie' olan nesnenin indexOf değerine sahip olmak istiyorum ki bu örnekte bu değer 1 olacaktır.

JavaScript konusunda oldukça acemiyim ve basit bir yöntem var mı yoksa bunu yapmak için kendi işlevimi mi oluşturmalıyım bilmiyorum.

Array.prototype.findIndex IE (edge olmayan) dışındaki tüm tarayıcılarda desteklenir. Ancak sağlanan polyfill güzel.

var indexOfStevie = myArray.findIndex(i => i.hello === "stevie");

Harita ile çözüm tamamdır. Ancak her aramada tüm dizi üzerinde yineleme yapıyorsunuz. Bu yalnızca bir eşleşme bulunduğunda yinelemeyi durduran findIndex için en kötü durumdur.


Gerçekten kısa ve öz bir yol yok **(geliştiriciler IE8 hakkında endişelenmek zorunda kaldıklarında)**, ancak burada'yaygın bir çözüm var:
var searchTerm = "stevie",
    index = -1;
for(var i = 0, len = myArray.length; i < len; i++) {
    if (myArray[i].hello === searchTerm) {
        index = i;
        break;
    }
}

veya bir fonksiyon olarak:

function arrayObjectIndexOf(myArray, searchTerm, property) {
    for(var i = 0, len = myArray.length; i < len; i++) {
        if (myArray[i][property] === searchTerm) return i;
    }
    return -1;
}
arrayObjectIndexOf(arr, "stevie", "hello"); // 1

Sadece bazı notlar:

  1. Dizilerdeki döngülerde for...kullanmayın
  2. İğnenizi bulduğunuzda döngüden çıktığınızdan veya fonksiyondan geri döndüğünüzden emin olun;
  3. Nesne eşitliği konusunda dikkatli olun

Örneğin,

var a = {obj: 0};
var b = [a];
b.indexOf({obj: 0}); // -1 not found
Yorumlar (8)
var idx = myArray.reduce( function( cur, val, index ){

    if( val.hello === "stevie" && cur === -1 ) {
        return index;
    }
    return cur;

}, -1 );
Yorumlar (0)

Bu örneğe bakın: http://jsfiddle.net/89C54/

for (i = 0; i < myArray.length; i++) {
    if (myArray[i].hello === 'stevie') {
        alert('position: ' + i);
        return;
    }
}

Sıfır ile saymaya başlar.

Yorumlar (0)