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.

8voto

Abdennour TOUMI Punkte 75271

Brief

myArray.indexOf('stevie','hello')

Anwendungsfälle :

  /*****NORMAL****/  
[2,4,5].indexOf(4) ;//OUTPUT 1
 /****COMPLEX*****/
 [{slm:2},{slm:4},{slm:5}].indexOf(4,'slm');//OUTPUT 1
 //OR
 [{slm:2},{slm:4},{slm:5}].indexOf(4,function(e,i){
   return e.slm;
});//OUTPUT 1
/***MORE Complex**/
[{slm:{salat:2}},{slm:{salat:4}},{slm:{salat:5}}].indexOf(4,function(e,i){
   return e.slm.salat;
});//OUTPUT 1

API :

    Array.prototype.indexOfOld=Array.prototype.indexOf

    Array.prototype.indexOf=function(e,fn){
      if(!fn){return this.indexOfOld(e)}
      else{ 
       if(typeof fn ==='string'){var att=fn;fn=function(e){return e[att];}}
        return this.map(fn).indexOfOld(e);
      }
    };

7voto

Uniphonic Punkte 850

Ich habe hier einige Leistungstests für verschiedene Antworten durchgeführt, die jeder selbst durchführen kann:

https://jsperf.com/find-index-of-object-in-array-by-contents

Nach meinen ersten Tests in Chrome ist die folgende Methode (mit einer for-Schleife innerhalb eines Prototyps) die schnellste:

Array.prototype.indexOfObject = function (property, value) {
    for (var i = 0, len = this.length; i < len; i++) {
        if (this[i][property] === value) return i;
    }
    return -1;
}

myArray.indexOfObject("hello", "stevie");

Dieser Code ist eine leicht modifizierte Version der Antwort von Nathan Zaetta.

In den Leistungsbenchmarks habe ich es sowohl mit dem Ziel in der Mitte (Index 500) als auch ganz am Ende (Index 999) eines Arrays mit 1000 Objekten ausprobiert, und selbst wenn ich das Ziel als allerletztes Element im Array einfüge (was bedeutet, dass es durch jedes einzelne Element im Array schleifen muss, bevor es gefunden wird), ist es immer noch am schnellsten.

Diese Lösung hat auch den Vorteil, dass sie eine der kürzesten Lösungen für die wiederholte Ausführung ist, da nur die letzte Zeile wiederholt werden muss:

myArray.indexOfObject("hello", "stevie");

4voto

John Doe Punkte 41

Versuchen Sie dies:

console.log(Object.keys({foo:"_0_", bar:"_1_"}).indexOf("bar"));

https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Object/keys

4voto

griffon vulture Punkte 6246

Einfach:

myArray.indexOf(myArray.filter(function(item) {
    return item.hello == "stevie"
})[0])

4voto

Cody Punkte 9242
array.filter(function(item, indx, arr){ return(item.hello === 'stevie'); })[0];

Beachten Sie die [0] .

Es ist angemessen, Folgendes zu verwenden reduce wie in Antonio Laguna die Antwort.

Entschuldigung für die Kürze...

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