716 Stimmen

indexOf-Methode in einem Objekt-Array?

Was ist die beste Methode, um den Index eines Arrays zu ermitteln, das Objekte enthält?

Stellen Sie sich folgendes Szenario vor:

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

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

Jetzt würde ich gerne die indexOf das Objekt, das hello Eigenschaft ist 'stevie' die in diesem Beispiel wie folgt aussehen würde 1 .

Ich bin ein ziemlicher Neuling in JavaScript und weiß nicht, ob es eine einfache Methode gibt oder ob ich meine eigene Funktion dafür erstellen sollte.

1374voto

Ich denke, man kann das Problem in einer Zeile lösen, indem man die Karte Funktion:

const pos = myArray.map(e => e.hello).indexOf('stevie');

531voto

Joe Punkte 78340

Array.prototype.findIndex wird in allen Browsern außer dem IE (non-edge) unterstützt. Aber die Polyfill zur Verfügung gestellt wird, ist nett.

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

Die Lösung mit der Karte ist in Ordnung. Aber Sie iterieren bei jeder Suche über das gesamte Array. Das ist nur der schlimmste Fall für findIndex der die Iteration beendet, sobald eine Übereinstimmung gefunden wurde.


Es gibt nicht wirklich eine prägnante Art (als sich die Entwickler noch um den IE8 kümmern mussten) aber hier ist eine gemeinsame Lösung:

var searchTerm = "stevie",
    index = -1;
for(var i = 0, len = myArray.length; i < len; i++) {
    if (myArray[i].hello === searchTerm) {
        index = i;
        break;
    }
}

oder als Funktion:

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

Nur einige Anmerkungen:

  1. Verwenden Sie keine for...-Schleifen für Arrays
  2. Vergewissern Sie sich, dass Sie die Schleife verlassen oder aus der Funktion zurückkehren, sobald Sie Ihre "Nadel" gefunden haben.
  3. Vorsicht bei Objektgleichheit

Zum Beispiel,

var a = {obj: 0};
var b = [a];
b.indexOf({obj: 0}); // -1 not found

155voto

Steve Bennett Punkte 97061

In ES2015 ist das ziemlich einfach:

myArray.map(x => x.hello).indexOf('stevie')

oder, wahrscheinlich mit besserer Leistung für größere Arrays:

myArray.findIndex(x => x.hello === 'stevie')

25voto

Esailija Punkte 134081
var idx = myArray.reduce( function( cur, val, index ){

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

}, -1 );

17voto

tandrewnichols Punkte 3376

Ich mag die Antwort von Pablo, aber Array#indexOf und Array#map funktionieren nicht auf allen Browsern. Underscore wird nativen Code verwenden, wenn es verfügbar ist, hat aber auch Fallbacks. Außerdem hat es die Pluck-Methode, die genau das tut, was Pablos anonyme Map-Methode tut.

var idx = _.chain(myArray).pluck("hello").indexOf("Stevie").value();

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X