以下代码出错: -
var x = [{id: 'abc'}, {id: 'xyz'}];
var index = x.indexOf({id: 'abc'});
上面的语法是什么?
答案 0 :(得分:4)
您应该将引用传递给您在数组中定义的完全相同的对象:
var a = {id: 'abc'},
b = {id: 'xyz'};
var index = [a, b].indexOf(a); // 0
答案 1 :(得分:2)
如果对象引用完全相同的对象实例,则它们只相互相等。
您需要实现自己的搜索功能。例如:
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
答案 2 :(得分:1)
答案 3 :(得分:1)
我们这里有一些不错的代码;)
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
答案 4 :(得分:0)
var o = {}
var x = [o]
console.log(x.indexOf(o))
使用x.indexOf({})
创建一个新的Object,它不存在于数组
答案 5 :(得分:0)
像这样迭代数组:
for(var i = 0, len = x.length; i < len; i++) {
if (x[i].id === 'abc') {
console.log(i);
break;
}
}
否则,您必须确保使用indexOf