2
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 を返すのはなぜですか?

4

1 に答える 1

4

オブジェクトの等価性テストは参照の等価性に基づいているため、これは機能しません。

MDNから:

2 つの異なるオブジェクトは、厳密な比較でも抽象的な比較でも決して等しくありません

wしたがって、 と の両方をループして比較することにより、インデックス検索を自分で実装する必要がありますh

例えば ​​:

   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
于 2013-06-24T14:14:16.580 に答える