Javascript Array.indexOf() 在应用于对象数组时表现出奇怪的行为
Javascript Array.indexOf() shows strange behaviour when applied to array of objects
我创建了以下代码http://jsfiddle.net/EbCUx/
var arr = [{a:1,b:2,c:3},{a:3,b:5,c:6}];
var a = arr[0];
alert(arr.indexOf(a));
var b = {a:1,b:2,c:3};
alert(arr.indexOf(b));
为什么 indexOf() 返回 -1,即使 a 和 b 的内容相同。我知道 a 是参考值..是不是原因...谁能解释一下确切的原因?
您正在比较 2 个不同的对象,它们恰好具有相同的值,但从相等的角度来看,它们仍然是不同的对象。
您的原始代码:
<script>
var arr = [{a:1,b:2,c:3},{a:3,b:5,c:6}];
var a = arr[0];
alert(arr.indexOf(a));
var b = {a:1,b:2,c:3};
alert(arr.indexOf(b));
</script>
显示如何在比较中获取匹配项的更新版本。
<script>
var b = {a:1,b:2,c:3};
var arr = [b,{a:3,b:5,c:6}];
var a = arr[0];
alert(arr.indexOf(a));
alert(arr.indexOf(b));
</script>
如果要比较恰好具有相同值的 2 个不同对象,则必须手动执行此操作。
来自 MDN:
indexOf 使用严格相等(与 === 或三等运算符使用的方法相同)将 searchElement 与数组的元素进行比较。
由于没有两个对象是严格相等的,因此不能使用 indexOf 来搜索对象数组,您必须循环(如果数组的元素是对象,则扩展 indexOf 以循环)
改用这个
添加此代码:
<script>
Array.prototype.newIndexOf = function( item ) {
var count = this.length;
var j = 0;
while (this[j++] !== item && j < count) {}
return (j === count) ? -1 : j;
}
</script>
indexOf 很慢,没有严格的相等检查。
http://jsperf.com/indexof-vs-equaling/2
相关文章:
- inArray,indexOf在二维数组中
- 为什么空数组上的 indexOf 不返回 -1
- 对象不支持在调用 indexOf 定义的数组时 IE8 中未定义的此属性或方法
- 使用Javascript在mongo中数组indexOf
- Javascript性能:如何在数组中循环并检查每个值比indexOf、search和match更快
- 数组表示形式内的字符串IndexOf
- javascript indexOf 无法检查数组中的相同数字
- JavaScript:Association/Object数组中的indexOf
- javascript数组indexOf中使用的regex
- 多维数组indexOf不工作js
- 哪个值是javascript数组.indexOf作为索引位置
- 对象值匹配数组indexOf中的任意值
- Javascript:什么查找更快:数组.indexOf vs对象哈希值
- 数组indexOf和过滤器实现的IE给其他问题
- JavaScript数组indexOf数组
- JavaScript数组indexOf()方法不工作
- 为什么IE7 javascript数组.indexOf不工作
- 怎么能数组.indexOf比Array.some更有效
- Javascript数组indexOf返回未定义的值
- Javascript数组indexOf by Key,Value问题