2017-02-20 3 views
1

Wie kann der Index eines Arrays in einer Array-Sammlung am besten gefunden werden? Warum gibt index_of() den richtigen Index nicht zurück? Ich vermute, es hat etwas mit der Gleichheit von Objekten zu tun?Verwenden von indexOf zum Abrufen des Index des Arrays in einer Array-Sammlung (JavaScript)

Ich habe gesehen, dass andere Lösungen die Auflistung durchlaufen und den Index zurückgeben, der erreicht wurde, wenn die Gleichheitsprüfung erfüllt ist, aber ich bin immer noch neugierig, warum indexOf() nicht dasselbe tut. Außerdem kann ich ES6's find/findIndex aufgrund der IE 11 Unterstützung nicht benutzen (wie immer). Ich habe meinen Testcode unten eingefügt. Danke vielmals.

var numbers = [ [1, 2, 3, 4, 5, 6], [7, 8, 9, 10, 11, 12] ]; 
 

 
function getIndex (numbersToTest) { 
 
    return numbers.indexOf(numbersToTest); 
 
}; 
 

 
function test() { 
 
    console.log(getIndex([1, 2, 3, 4, 5, 6])); // Except 0 
 
    console.log(getIndex([7, 8, 9, 10, 11, 12])); // Expect 1 
 
    console.log(getIndex([2, 1, 3, 4, 5, 6])); // Expect -1 (not in same order) 
 
} 
 

 
test();

+0

Sie haben recht, es hat etwas mit der Gleichheit von Objekten zu tun, weil '[] == []' 'false' ist. –

+0

Ich hatte eine Antwort auf diese Frage, in diesem Fall könnte util vergleichen Arrays als Zeichenfolge sein, https://jsfiddle.net/dbpLenwu/ –

+0

@trincot Ich glaube nicht, dass dies eine doppelte Frage ist, wie ich nach dem besten suchte Weg, um den Index des Arrays zu finden und wollte auch einige Hintergrundinformationen darüber, warum IndexOf nicht funktioniert (was war nicht der Haupt Diskussionspunkt). Danke vielmals. – poolts

Antwort

1

Objektreferenzen (einschließlich Arrayreferenzen) werden als Referenzwerte verglichen wird; Eine Objektreferenz ist nur dann gleich einer anderen, wenn beide Referenzen auf das exakt gleiche Objekt verweisen. Der Vergleich wird nicht auf Basis des Inhalts der Arrays in Ihrem Fall durchgeführt. Obwohl diese Arrays die gleichen Werte aufweisen, sind sie unterschiedliche Arrays und daher nicht mit den Arrays in der ursprünglichen Liste identisch.

Stattdessen müssen Sie so etwas wie Array#find verwenden (um den Eintrag zu finden) oder Array#findIndex (den Eintrags des Index zu finden), in einem Rückruf vorbei, die das Array in numbers mit numbersToTest vergleichen, um zu sehen, wenn sie gleichwertige Anordnungen sind. This question's answers sprechen über verschiedene Möglichkeiten zum effizienten Vergleich von Arrays für die Äquivalenz.

Zum Beispiel:

var numbers = [ [1, 2, 3, 4, 5, 6], [7, 8, 9, 10, 11, 12] ]; 
 

 
function getIndex (numbersToTest) { 
 
    return numbers.findIndex(function(entry) { 
 
    // Simple comparison that works for an array of numbers 
 
    return entry.length === numbersToTest.length && entry.every(function(number, index) { 
 
     return numbersToTest[index] === number; 
 
    }); 
 
    }); 
 
}; 
 

 
function test() { 
 
    console.log(getIndex([1, 2, 3, 4, 5, 6])); // Expect 0 
 
    console.log(getIndex([7, 8, 9, 10, 11, 12])); // Expect 1 
 
    console.log(getIndex([2, 1, 3, 4, 5, 6])); // Expect -1 (not in same order) 
 
} 
 

 
test();

Beachten Sie, dass beide Array#find und Array#findIndex neuere sind (ES2015, auch bekannt als "ES6"), kann aber für ältere JavaScript Motoren polyfilled werden.

+0

Danke @TJCrowder Ich schulde dir ein Bier :) – Pointy

Verwandte Themen