次のコードのエラー:-
var x = [{id: 'abc'}, {id: 'xyz'}];
var index = x.indexOf({id: 'abc'});
上記の構文は何ですか?
次のコードのエラー:-
var x = [{id: 'abc'}, {id: 'xyz'}];
var index = x.indexOf({id: 'abc'});
上記の構文は何ですか?
配列で定義したのとまったく同じオブジェクトへの参照を渡す必要があります。
var a = {id: 'abc'},
b = {id: 'xyz'};
var index = [a, b].indexOf(a); // 0
オブジェクトは、オブジェクトのまったく同じインスタンスを参照している場合にのみ、互いに同等です。
独自の検索機能を実装する必要があります。例えば:
Array.prototype.indexOfObject = function(obj) {
var l = this.length, i, k, ok;
for( i=0; i<l; i++) {
ok = true;
for( k in obj) if( obj.hasOwnProperty(k)) {
if( this[i][k] !== obj[k]) {
ok = false;
break;
}
}
if( ok) return i;
}
return -1; // no match
};
var x = [{id: 'abc'}, {id: 'xyz'}];
var index = x.indexOfObject({id: 'abc'}); // 0
次のように配列を反復処理します。
for(var i = 0, len = x.length; i < len; i++) {
if (x[i].id === 'abc') {
console.log(i);
break;
}
}
それ以外の場合は、探しているオブジェクトのポインターが同じであることを確認する必要がありますindexOf
ここに素敵なコードを書きましょう ;)
Underscore.js は を提供しますがwhere
、これも純粋な JS で書くのはかなり簡単です。
Array.prototype.where = function(props) {
return this.filter(function(e) {
for (var p in props)
if (e[p] !== props[p])
return false;
return true;
});
}
別の (より柔軟な) 関数は、オブジェクトまたは関数をセレクターとして認識します。
Array.prototype.indexBy = function(selector) {
var fn = typeof selector == "function" ? selector :
function(elem) {
return Object.keys(selector).every(function(k) {
return elem[k] === selector[k]
})
}
return this.map(fn).indexOf(true);
}
その後
var x = [{id: 'abc'}, {id: 'xyz'}];
x.indexBy({'id': 'xyz'}) // works
x.indexBy(function(elem) { return elem.id == 'xyz' }) // works too
var o = {}
var x = [o]
console.log(x.indexOf(o))
x.indexOf({})
新しいオブジェクトを作成すると、配列に存在しません