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 を返すのはなぜですか?
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 を返すのはなぜですか?
オブジェクトの等価性テストは参照の等価性に基づいているため、これは機能しません。
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