2017-08-13 1 views
0

ich eine Liste der Indexpositionen in einer Variablen namens Positionen haben, ich mag den Index einer der Positionen finden wollen ...Javascript indexOf nicht mit Listendaten arbeiten

positions[0] 
(2) [0, 0] 

positions.indexOf([0,0]); 
-1 

var item = positions[0] 
undefined 

item 
(2) [0, 0]0: 01: 0length: 2__proto__: Array(0)concat: ... 

positions.indexOf(item); 
0 

Was wäre der Weg In diesem Fall indexOf zu verwenden?

Antwort

3

Die Methode indexOf verwendet einen strikten Vergleich, um die Übereinstimmung zu finden. Dies ist der gleiche von === verwendete Vergleichsalgorithmus und vergleicht Identität von Objekttypen (wie Array). Wenn Sie also [0,0] übergeben, übergeben Sie ein neues Objekt mit einer eigenen Identität, sodass keine Übereinstimmung gefunden wird.

Deshalb funktioniert es, wenn Sie speziell für das Element bei Index 0 suchen. Sie finden das Array jetzt mit der gleichen Identität.

Damit es funktioniert, wie Sie möchten, müssen Sie einen benutzerdefinierten Objektvergleich verwenden, der die Mitglieder des Arrays berücksichtigt. JavaScript hat nichts dergleichen eingebaut, aber Sie finden Lösungen, wenn Sie nach "Deep Equality Comparison" suchen.

Sobald Sie die Vergleichsfunktion haben, können Sie .findIndex() verwenden, um es für jedes Objekt auszuführen.

var data = [0, 0]; 
var result = positions.findIndex(function(item) { 
    // return result of comparing `data` with `item` 

    // This simple implementation assumes that all `item`s will be Arrays. 
    return data.length === item.length && 
     item.every(function(n, i) { return n === data[i] }); 
}); 

Streng genommen wenn die Mitglieder positions sind alle Arrays mit Zahlen als Mitglieder, könnten Sie JSON.stringify() verwenden Sie den Vergleich. Aber trauen Sie es nicht, wenn die verglichenen Mitglieder anderen Objekttypen angehören. Es kann scheinen zu arbeiten, könnte aber ohne vorherige Ankündigung fehlschlagen.

var data = JSON.stringify([0, 0]); 
var result = positions.findIndex(function(item) { 
    return data === JSON.stringify(item); 
}); 
+1

Dank @blex, Sie haben Recht. Das OP scheint den Index zu wollen. Ich werde aktualisieren. – spanky