método indexOf em uma matriz de objetos?

Qual'é o melhor método para obter o índice de um array que contém objetos?

Imagina este cenário:

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

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

Agora eu gostaria de ter o indexOf o objeto cuja propriedade hello é 'stevie' que, neste exemplo, seria 1.

I'sou bastante novato com JavaScript e eu não'não sei se existe um método simples ou se eu deveria construir minha própria função para fazer isso.

Array.prototype.findIndex é suportado em todos os navegadores que não o IE (non-edge). Mas o polyfill fornecido é bom.

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

A solução com o mapa está bem. Mas você está iterando sobre toda a matriz a cada busca. Esse é apenas o pior caso para findIndex que pára de iterar uma vez que uma correspondência é encontrada.


There's not really a concise way **(when devs had to worry about IE8)**, but here's a common solution:
var searchTerm = "stevie",
    index = -1;
for(var i = 0, len = myArray.length; i < len; i++) {
    if (myArray[i].hello === searchTerm) {
        index = i;
        break;
    }
}

ou como uma função:

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

Só algumas notas:

  1. Don't use para...em loops em arrays
  2. Não se esqueça de sair do laço ou voltar para fora da função assim que você'tiver encontrado o seu "needle"
    1. Tenha cuidado com a igualdade de objetos

Por exemplo,

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

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

}, -1 );
Comentários (0)

Veja este exemplo: http://jsfiddle.net/89C54/

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

Começa a contar com zero.

Comentários (0)