it-swarm.com.de

Wie kann ich den Index in einem Array verwenden von underscore.js finden?

Ich möchte den Index des angegebenen Werts in einem Array mit Underscore.js abrufen.

Hier ist mein Fall

var array = [{'id': 1, 'name': 'xxx'},
             {'id': 2, 'name': 'yyy'},
             {'id': 3, 'name': 'zzz'}];

var searchValue = {'id': 1, 'name': 'xxx'};

Ich habe den folgenden Code verwendet,

var index = _.indexOf(array, function(data) { 
                alert(data.toSource()); //For testing purpose 
                return data === searchValue; 
            });

Auch dies versucht

var index = _.indexOf(array, {id: searchValue.id});

Aber es returns -1. Da geht diese Funktion nicht ein. Also bekam ich diese Warnmeldung nicht.

Was stimmt nicht mit meinem Code ... Kann mir jemand helfen? 

10
prince

Verwenden Sie dies stattdessen:

var array = [{'id': 1, 'name': 'xxx'},
             {'id': 2, 'name': 'yyy'},
             {'id': 3, 'name': 'zzz'}];

var searchValue = {'id': 1, 'name': 'xxx'},
    index = -1;

_.each(array, function(data, idx) { 
   if (_.isEqual(data, searchValue)) {
      index = idx;
      return;
   }
});

console.log(index); //0

In Ihrem Snippet vergleicht data === searchValue die Referenzen der Objekte, Sie möchten dies nicht tun. Wenn Sie dagegen data == searchValue verwenden, werden Sie die Zeichenfolgendarstellungen von Objekten vergleichen, d. H. [Object object], wenn Sie toString Methoden nicht neu definiert haben.

Der richtige Weg, die Objekte zu vergleichen, ist die Verwendung von _.isEqual.

14
Minko Gechev

Ich würde dringend empfehlen, sich einen Blick auf lodash zu werfen. Es enthält ziemlich viele kleine Funktionen, die leider nicht unterstützt werden. 

Zum Beispiel würden Sie mit lodash Folgendes tun: 

var array = [{'id': 1, 'name': 'xxx'},
           {'id': 2, 'name': 'yyy'},
           {'id': 3, 'name': 'zzz'}];

var searchValue = {'id': 1, 'name': 'xxx'};


var index = _.findIndex(array, searchValue); 
console.log(index === 0); //-> true

http://lodash.com/docs#findIndex

Wenn Sie Underscore unbedingt verwenden möchten, können Sie sich den Unterstrich von lodash unter https://raw.github.com/lodash/lodash/2.4.1/dist/lodash.underscore.js holen.


ES2015

Mit der ES2015, die jetzt weit verbreitet ist (durch Transpiler wie Babel), können Sie für die anstehende Aufgabe auf "lodash" und "Unterstreichen" verzichten und native Methoden verwenden: 

var arr = [{ id: 1 }, { id: 2}];

arr.findIndex(i => i.id === 1); // 0
15
Kasper Lewau

Möglicherweise wird mein Vorschlag Sie beraten.

Warum verwenden Sie Callback für die Methode indexof? Die Signatur von indexof in underscore.js lautet wie folgt:

_.indexOf(array, value, [isSorted]) 

find könnte für diese Aufgabe besser sein:

_.find(array, function(item, index) {
  if (item.id == searchValue.id) {
    alert(index);
  }
});

Unterstrich verwendet, falls vorhanden, die native indexOf-Methode, andernfalls Fallback. Für eine Liste von Objekten müssen Sie diese also auf andere Weise implementieren.

Ein Beispiel könnte sein 

_.chain(array).pluck("key").indexOf("value").value();

oder

_.map(array,function(e) { return e.key; }).indexOf(value);
2
n_n

Bei Objekten überprüfen === und ==, ob zwei Referenzen auf das Objekt same verweisen. Es wird nicht nach äquivalenten Objekten gesucht:

var a = {foo: "bar"};
var b = {foo: "bar"};
console.log(a === b); // false, `a` and `b` refer to different (but equivalent) objects
a = b = {something: "here"};
console.log(a === b); // true, `a` and `b` refer to the *same* object

Sie müssen die Eigenschaften des Objekts testen, um die Entscheidung zu treffen. In Ihrem Fall sieht die Eigenschaft id wie eine gute Option aus. Wenn Sie alle Eigenschaften miteinander vergleichen möchten, können Sie die Unterstreichung isEqual verwenden.

2
T.J. Crowder
_.find(array, function(item, index) {
  if (item.id == searchValue.id) {
    alert(index);
  }
});
0
riyas tk

Falls Sie über komplizierte Objekte verfügen und ein Objekt in der Sammlung suchen möchten, suchen Sie nach einer bestimmten Eigenschaft.

 _.indexOf(arrayObj, _.findWhere(arrayObj, {id: 1})  );

Wo "arrayObj" die Auflistung mit Objekten ist, "id" die Requisite und "1" der Wert, der gesucht wird.

0
Nicolae Lozovan