为什么在indexOf数组中找不到对象

时间:2014-10-12 22:15:05

标签: javascript

当我在下面搜索对象文字时,我得到索引-1但我不明白为什么。

我是否可以不使用像object literal这样的复杂类型来搜索数组中的这个对象?

var fruits = [{name: "Banana"}, {name: "Orange"}];
var index = fruits.indexOf({name: "Banana"});

2 个答案:

答案 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;
   }
}