当我在下面搜索对象文字时,我得到索引-1但我不明白为什么。
我是否可以不使用像object literal这样的复杂类型来搜索数组中的这个对象?
var fruits = [{name: "Banana"}, {name: "Orange"}];
var index = fruits.indexOf({name: "Banana"});
答案 0 :(得分:1)
-1
表示在数组中找不到{name: "Banana"}
。这是因为第一个{name: "Banana"}
是与第二个{name: "Banana"}
不同的对象。
如果您正在搜索原始类型,它将按您期望的方式工作。但是,对于一个对象,它看起来看到实际的对象是相同的东西(即内存中的相同位置)而不仅仅是它们具有相同的值。
所以:
[0,1,2,3].indexOf(3); // 3, no surprise
var foo = {name: "Banana"};
[foo].indexOf(foo); // 0, no surprise
var bar = {name: "Banana"};
[foo].indexOf({name: "Banana"}); // -1, here's your wtf moment,
foo
是与bar
不同的对象。它们碰巧具有相同的属性。但它们在记忆中占据不同的位置。或者,换句话说,如果我修改foo
,则bar
保持不变。
许多图书馆为您解决了“深度平等”问题,所以如果您使用的是jQuery或者Underscore,请查看。否则,请查看如何实施,因为有一些问题。
答案 1 :(得分:1)
对于多维数组,我不相信你可以用这么简单的方式使用indexOf,但是,你可以使用这样的东西:
for(var i = 0; i < fruits.length; i++) {
if(fruits[i].name === 'Banana') {
return i;
}
}