在数组集合中找到数组的索引的最佳方法是什么?为什么indexof()不返回正确的索引?我猜这与对象平等有关?
我看到了其他解决方案循环通过该集合,并在满足平等检查时返回索引到达,但是我仍然很好奇indexof()为什么不做同样的事情。此外,由于IE 11支持(一如既往),我无法使用ES6的Find/FindIndex。我在下面包括了我的测试代码。非常感谢。
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();
对象引用(包括数组引用)被比较为参考值;一个对象引用仅在两个引用均为完全相同的对象的情况下等于另一个对象。在您的情况下,不是根据阵列的内容进行比较。即使您传递的那些数组具有相同的值,它们也不是不同的数组,因此不等于原始列表中的任何数组。
相反,您需要使用诸如Array#find
(查找条目)或Array#findIndex
(查找条目索引)之类的东西,并将其通过将numbers
中的数组与numbersToTest
进行比较的回调,以查看它们是否等于阵列。这个问题的答案讨论了有效比较阵列等效的各种方法。
例如:
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();
请注意,Array#find
和Array#findIndex
都是Newish(ES2015,又名" ES6"),但可以用于较旧的JavaScript引擎。