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.

3voto

GibboK Punkte 67729

Sie können eine native und bequeme Funktion verwenden Array.prototype.findIndex() grundsätzlich:

Die Methode findIndex() gibt einen Index im Array zurück, wenn ein Element im Array die angegebene Testfunktion erfüllt. Andernfalls wird -1 zurückgegeben.

Nur ein Hinweis, es ist nicht auf Internet Explorer, Opera und Safari unterstützt, aber Sie können ein Polyfill in den Link unten zur Verfügung gestellt verwenden.

Weitere Informationen:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/findIndex

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

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

var index = myArray.findIndex(function(element, index, array) {
  if (element.hello === 'stevie') {
    return true;
  }
});
alert('stevie is at index: ' + index);

3voto

zurfyx Punkte 27060

Wenn Sie nur daran interessiert sind, die Stelle zu finden, sehen Sie unter @Pablo's Antwort .

pos = myArray.map(function(e) { return e.hello; }).indexOf('stevie');

Wenn Sie sich jedoch auf Folgendes freuen Finden des Elements (z.B. wenn Sie so etwas vorhätten myArray[pos] ), gibt es eine effizientere Einzeiler Art und Weise, dies zu tun, mit filter .

element = myArray.filter((e) => e.hello === 'stevie')[0];

Siehe Leistungsergebnisse (~ +42% ops/sec): http://jsbench.github.io/#7fa01f89a5dc5cc3bee79abfde80cdb3

2voto

niren Punkte 2603

Verwenden Sie _.findIndex de underscore.js-Bibliothek

Hier ein Beispiel _.findIndex([{a:1},{a: 2,c:10},{a: 3}], {a:2,c:10}) //1

2voto

Armin Punkte 14621

Siehe dieses Beispiel: http://jsfiddle.net/89C54/

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

Sie beginnt mit Null zu zählen.

2voto

ssube Punkte 44593

Verwendung des ES6 findIndex Methode Ohne Lodash oder andere Bibliotheken können Sie schreiben:

function deepIndexOf(arr, obj) {
  return arr.findIndex(function (cur) {
    return Object.keys(obj).every(function (key) {
      return obj[key] === cur[key];
    });
  });
}

Dabei werden die unmittelbaren Eigenschaften des Objekts verglichen, aber nicht in die Eigenschaften zurückgesucht.

Wenn Ihre Implementierung nicht die Möglichkeit bietet findIndex noch nicht haben (die meisten nicht), können Sie ein leichtes Polyfill hinzufügen, das diese Suche unterstützt:

function deepIndexOf(arr, obj) {
  function findIndex = Array.prototype.findIndex || function (pred) {
    for (let i = 0; i < this.length; ++i) {
      if (pred.call(this, this[i], i)) {
        return i;
      }
    }

    return -1;
  }

  return findIndex.call(arr, function (cur) {
    return Object.keys(obj).every(function (key) {
      return obj[key] === cur[key];
    });
  });
}

(aus meiner Antwort auf dieses Duplikat )

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