530 Stimmen

Holen Sie sich den Index des Objekts in einem Array, das einer Bedingung entspricht

Ich habe ein Array wie dieses:

[{prop1:"abc",prop2:"qwe"},{prop1:"bnmb",prop2:"yutu"},{prop1:"zxvz",prop2:"qwrq"},...]

Wie kann ich den Index des Objekts erhalten, das einer Bedingung entspricht, ohne das gesamte Array zu durchlaufen?

Zum Beispiel, gegeben prop2=="yutu", möchte ich den Index 1 erhalten.

Ich habe .indexOf() gesehen, aber ich denke, es wird für einfache Arrays wie ["a1","a2",...] verwendet. Ich habe auch $.grep() überprüft, aber das gibt Objekte zurück, nicht den Index.

1voto

Sanjoy Punkte 420

Georg hat bereits erwähnt, dass ES6 mit Array.findIndex dafür ausgestattet ist. Und einige andere Antworten sind Workarounds für ES5 unter Verwendung der Array.some Methode.

Ein weiterer eleganter Ansatz kann sein

var index;
for(index = yourArray.length; index-- > 0 && yourArray[index].prop2 !== "yutu";);

Gleichzeitig möchte ich betonen, dass Array.some mit einer binären oder einer anderen effizienten Suchtechnik implementiert sein kann. Daher könnte es in einigen Browsern eine bessere Leistung als die for-Schleife erbringen.

0voto

Rishabh Punkte 1901

Warum möchtest du nicht genau iterieren? Die neuen Array.prototype.forEach sind großartig dafür!

Du kannst einen Binärbaum verwenden, um mit einem einzigen Methodenaufruf zu finden, wenn du möchtest. Dies ist eine elegante Implementierung von BTree und Red-Black-Suchbaum in JS - https://github.com/vadimg/js_bintrees - aber ich bin mir nicht sicher, ob du dabei den Index finden kannst.

0voto

aaa Punkte 601

Einen Schritt mit Array.reduce() - kein jQuery

var items = [{id: 331}, {id: 220}, {id: 872}];

var searchIndexForId = 220;
var index = items.reduce(function(searchIndex, item, index){
  if(item.id === searchIndexForId) { 
    console.log('Gefunden!');
    searchIndex = index;
  }
  return searchIndex;
}, null);

wird null zurückgeben, wenn der Index nicht gefunden wurde.

0voto

var list =  [
                {prop1:"abc",prop2:"qwe"},
                {prop1:"bnmb",prop2:"yutu"},
                {prop1:"zxvz",prop2:"qwrq"}
            ];

var findProp = p => {
    var index = -1;
    $.each(list, (i, o) => {
        if(o.prop2 == p) {
            index = i;
            return false; // break
        }
    });
    return index; // -1 == not found, else == index
}

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