Suchen Sie den Array-Index eines Objekts mit einem bestimmten Schlüsselwert im Unterstrich

Lesezeit: 4 Minuten

Im Unterstrich kann ich erfolgreich ein Element mit einem bestimmten Schlüsselwert finden

var tv = [{id:1},{id:2}]
var voteID = 2;
var data = _.find(tv, function(voteItem){ return voteItem.id == voteID; });
//data = { id: 2 }

aber wie finde ich heraus, an welchem ​​​​Array-Index das Objekt aufgetreten ist?

  • mögliches Duplikat von Gibt es einen indexOf in Javascript, um ein Array mit benutzerdefinierter Vergleichsfunktion zu durchsuchen

    – Bergi

    7. Februar 2014 um 15:10 Uhr

  • Danke – das ist nützlich – aber in dem aufgeführten Beispiel suchen Sie nach einer einzelnen Zahl in einem Array von Zahlen – ich suche nach einem Schlüsselwert in einem Array von Objekten. Wird diese Funktion das berücksichtigen?

    – mheavers

    7. Februar 2014 um 15:22 Uhr


  • Ob es sich um einen numerischen Test oder Ihr Eigenschaftsgleichheitsprädikat handelt, spielt keine Rolle, ja.

    – Bergi

    7. Februar 2014 um 15:24 Uhr

  • Versuchen findIndex: var dataIndex = _.findIndex(tv, { id: voteID })

    – Tom Söderlund

    9. Juli 2017 um 13:23 Uhr


  • Bitte erwägen Sie, die Antwort zu akzeptieren, die eine Unterstrich-Lösung gibt, wie in der Frage gefordert.

    Benutzer2493235

    17. September 2017 um 20:31 Uhr


Benutzer-Avatar
Ropez

findIndex wurde in 1.8 hinzugefügt:

index = _.findIndex(tv, function(voteItem) { return voteItem.id == voteID })

Sehen: http://underscorejs.org/#findIndex

Alternativ funktioniert dies auch, wenn es Ihnen nichts ausmacht, eine weitere temporäre Liste zu erstellen:

index = _.indexOf(_.pluck(tv, 'id'), voteId);

Sehen: http://underscorejs.org/#pluck

  • Beim Unterstrich bin ich mir nicht sicher, aber in Lodash brauchen Sie einfach keine anonyme Funktion index = _.findIndex(tv, {id: voteID}) funktioniert, funktioniert auch, wenn die tv Sammlung hat kompliziertere Werte (mehr als nur eine id Eigentum)

    – Scott Jungwirth

    9. Oktober 2015 um 21:25 Uhr


  • Nur ein Punkt mit Zupfen ist so viel langsamer. Ich wegen seiner zusätzlichen Traverse. jsperf.com/compare-find-index

    – Farshid Saberi

    8. November 2016 um 6:26 Uhr


Lo-Dashdas Underscore erweitert, hat findIndex Methode, die den Index einer bestimmten Instanz finden kann, oder durch ein bestimmtes Prädikat oder gemäß den Eigenschaften eines bestimmten Objekts.

In deinem Fall würde ich tun:

var index = _.findIndex(tv, { id: voteID });

Versuche es.

  • findIntex ist eine Methode von lo-dash, nicht von underscore

    – Wallysson Nunes

    8. Januar 2015 um 16:40 Uhr

  • @WallyssonNunes Genau das habe ich geschrieben – “Lo-Dash, das Underscore erweitert, hat die Methode findIndex”

    – Splitter

    10. Januar 2015 um 20:57 Uhr

  • Dies ist ab Version 1.8.0 jetzt Teil der Standardbibliothek für Unterstriche: underscorejs.org/#1.8.0

    – Gage-Händler

    26. Februar 2015 um 21:21 Uhr


Benutzer-Avatar
lastoneisbearfood

Wenn Sie beim Unterstrich bleiben möchten, damit Ihre Prädikatfunktion flexibler ist, hier sind 2 Ideen.

Methode 1

Da das Prädikat für _.find erhält sowohl den Wert als auch den Index eines Elements, können Sie den Index wie folgt abrufen:

var idx;
_.find(tv, function(voteItem, voteIdx){ 
   if(voteItem.id == voteID){ idx = voteIdx; return true;}; 
});

Methode 2

Wenn Sie sich die Unterstrichquelle ansehen, gehen Sie folgendermaßen vor _.find ist implementiert:

_.find = _.detect = function(obj, predicate, context) {
  var result;
  any(obj, function(value, index, list) {
    if (predicate.call(context, value, index, list)) {
      result = value;
      return true;
    }
  });
  return result;
};

Um dies zu machen, a findIndex Funktion, ersetzen Sie einfach die Zeile result = value; mit result = index; Dies ist die gleiche Idee wie bei der ersten Methode. Ich habe es eingefügt, um darauf hinzuweisen, dass der Unterstrich Nebeneffekte zur Implementierung verwendet _.find auch.

Benutzer-Avatar
tewathia

Ich weiß nicht, ob es eine vorhandene Unterstrichmethode gibt, die dies tut, aber Sie können dasselbe Ergebnis mit einfachem Javascript erzielen.

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

Dann können Sie einfach tun:

var data = tv[tv.getIndexBy("id", 2)]

Wenn Ihre Zielumgebung ES2015 unterstützt (oder Sie einen Transpile-Schritt haben, zB mit Babel), können Sie das native Array.prototype.findIndex() verwenden.

Angesichts Ihres Beispiels

const array = [ {id:1}, {id:2} ]
const desiredId = 2;
const index = array.findIndex(obj => obj.id === desiredId);

Benutzer-Avatar
Amil Sajew

Sie können verwenden indexOf Methode aus lodash

var tv = [{id:1},{id:2}]
var voteID = 2;
var data = _.find(tv, function(voteItem){ return voteItem.id == voteID; });
var index=_.indexOf(tv,data);

Benutzer-Avatar
Joyrexus

Halten Sie es einfach:

// Find the index of the first element in array
// meeting specified condition.
//
var findIndex = function(arr, cond) {
  var i, x;
  for (i in arr) {
    x = arr[i];
    if (cond(x)) return parseInt(i);
  }
};

var idIsTwo = function(x) { return x.id == 2 }
var tv = [ {id: 1}, {id: 2} ]
var i = findIndex(tv, idIsTwo) // 1

Oder, für Nicht-Hasser, die CoffeeScript-Variante:

findIndex = (arr, cond) ->
  for i, x of arr
    return parseInt(i) if cond(x)

  • besser wäre return parseInt(i) for i, x of array when cond(x)

    – Benutzer229044

    12. August 2014 um 18:51 Uhr


  • Wie ist das einfacher als vorherige Antworten?

    – ncubica

    23. Juni 2015 um 3:19 Uhr

1186050cookie-checkSuchen Sie den Array-Index eines Objekts mit einem bestimmten Schlüsselwert im Unterstrich

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy