我有一个名为position的变量中的索引位置列表,我想找到其中一个位置的索引,如...
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
在这种情况下使用indexOf的方法是什么?
答案 0 :(得分:3)
indexOf
方法使用严格比较来查找匹配项。这与===
使用的比较算法相同,它比较了对象类型的 identity (如Array)。因此,当您传递[0,0]
时,您传递的是具有自己标识的新对象,因此找不到匹配项。
当你专门搜索索引0
的项目时,这就是它的原因。您现在找到具有相同身份的阵列。
为了使其按您希望的方式工作,您需要使用自定义对象比较,该比较考虑了Array的成员。 JavaScript没有内置的内容,但如果您搜索“深度相等比较”,您将找到解决方案。
拥有比较功能后,您可以使用.findIndex()
在每个对象上运行它。
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] });
});
严格地说,如果 positions
的成员都是数字为成员的数组,您可以使用JSON.stringify()
进行比较。但如果被比较的成员属于其他对象类型,请不要相信它。它可能似乎可以工作,但可能会在没有通知的情况下失败。
var data = JSON.stringify([0, 0]);
var result = positions.findIndex(function(item) {
return data === JSON.stringify(item);
});