359 Stimmen

Wie kann ich den Index eines Objekts anhand seiner Eigenschaft in JavaScript ermitteln?

Ich habe zum Beispiel:

var Data = [
  { id_list: 1, name: 'Nick', token: '312312' },
  { id_list: 2, name: 'John', token: '123123' },
]

Dann möchte ich sortieren/umkehren dieses Objekt durch name zum Beispiel. Und dann möchte ich so etwas wie das hier bekommen:

var Data = [
  { id_list: 2, name: 'John', token: '123123' },
  { id_list: 1, name: 'Nick', token: '312312' },
]

Und jetzt möchte ich den Index des Objekts mit der Eigenschaft name='John' um den Wert des Eigenschafts-Tokens zu erhalten.

Wie kann ich das Problem lösen?

471voto

German Attanasio Punkte 19503

Da der Teil mit dem Sortieren bereits beantwortet ist. Ich werde einfach einen anderen eleganten Weg vorschlagen, um den indexOf einer Eigenschaft in Ihrem Array zu erhalten

Ihr Beispiel ist:

var Data = [
    {id_list:1, name:'Nick', token:'312312'},
    {id_list:2, name:'John', token:'123123'}
]

Das können Sie tun:

var index = Data.map(function(e) { return e.name; }).indexOf('Nick');

var Data = [{
    id_list: 1,
    name: 'Nick',
    token: '312312'
  },
  {
    id_list: 2,
    name: 'John',
    token: '123123'
  }
]
var index = Data.map(function(e) {
  return e.name;
}).indexOf('Nick');
console.log(index)

Array.prototype.map ist nicht verfügbar auf Internet Explorer 7 oder Internet Explorer 8. ES5-Kompatibilität

Und hier ist es mit ES6 und der Pfeilsyntax, die noch einfacher ist:

const index = Data.map(e => e.name).indexOf('Nick');

389voto

silverlight513 Punkte 4842

Wenn Sie mit der Verwendung von ES6 zurechtkommen, haben Arrays jetzt die findIndex Funktion. Das heißt, Sie können so etwas tun:

const index = Data.findIndex(item => item.name === 'John');

195voto

Chris Pickett Punkte 2792

Wie die anderen Antworten andeuten, ist eine Schleife durch das Array wahrscheinlich der beste Weg. Aber ich würde es in eine eigene Funktion packen und es ein wenig abstrakter machen:

function findWithAttr(array, attr, value) {
    for(var i = 0; i < array.length; i += 1) {
        if(array[i][attr] === value) {
            return i;
        }
    }
    return -1;
}

var Data = [
    {id_list: 2, name: 'John', token: '123123'},
    {id_list: 1, name: 'Nick', token: '312312'}
];

Damit können Sie nicht nur herausfinden, welche davon "John" enthält, sondern auch, welche das Token "312312" enthält:

findWithAttr(Data, 'name', 'John'); // returns 0
findWithAttr(Data, 'token', '312312'); // returns 1
findWithAttr(Data, 'id_list', '10'); // returns -1

Die Funktion gibt -1 zurück, wenn sie nicht gefunden wird, sie folgt also demselben Konstrukt wie Array.prototype.indexOf() .

40voto

Alain T. Punkte 34859

Wenn Sie Probleme mit dem Internet Explorer haben, können Sie die Funktion map() verwenden, die von 9.0 vorwärts:

var index = Data.map(item => item.name).indexOf("Nick");

33voto

edank Punkte 589
var index = Data.findIndex(item => item.name == "John")

Das ist eine vereinfachte Version von:

var index = Data.findIndex(function(item){ return item.name == "John"})

En mozilla.org:

Die Methode findIndex() gibt den Index des ersten Elements im Array zurück, das die angegebene Testfunktion erfüllt. Andernfalls wird -1 zurückgegeben.

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