$ .inArray总是为对象数组返回-1

时间:2013-06-24 14:13:08

标签: javascript jquery

var myWidth = 20;
var myHeight = 30;

allDims = [
  {w: 20, h: 30},
  {w: 10, h: 15}
]

if ($.inArray({w: myWidth, h: myHeight}, allDims) !== -1) {
   ...
}

为什么if条件总是返回-1?

1 个答案:

答案 0 :(得分:4)

这不起作用,因为对象的相等测试基于引用的相等性。

来自the MDN

  

严格或抽象的两个不同的对象永远不会相等   比较

因此,您必须自行实施索引搜索,方法是循环并比较wh

例如:

   var index = -1;
   for (var i=0; i<allDims.length; i++) {
      if (allDims[i].w==myWidth && allDims[i].h==myHeight) {
          index = i;
          break;
      }
   }

如果你想要更优雅的东西,你可以使用filter并传递一个函数,但即使不需要它也会迭代整个数组。可以设计类似于indexOf但采用回调来检查相等性的通用函数:

Array.prototype.indexFunc = function(o, equal) {
  for (var i=0; i<this.length; i++) {
     if (equal(o,this[i])) return i;
  }
  return -1;
}
console.log(allDims.indexFunc({w:10, h:15}, function(a,b) {
       return a.w==b.w && a.h==b.h
})); // logs 1