Ошибка в следующем коде: -IndexOf (объект) в JavaScript
var x = [{id: 'abc'}, {id: 'xyz'}];
var index = x.indexOf({id: 'abc'});
Что синтаксис выше?
Ошибка в следующем коде: -IndexOf (объект) в JavaScript
var x = [{id: 'abc'}, {id: 'xyz'}];
var index = x.indexOf({id: 'abc'});
Что синтаксис выше?
Объекты равны друг другу, если они относятся к одному и тому же экземпляру объекта.
Вам нужно будет реализовать собственную функцию поиска. Например:
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
var o = {}
var x = [o]
console.log(x.indexOf(o))
С x.indexOf({})
вы создаете новый объект, на который не присутствует в массиве
Вы должны передать ссылку на точно такой же объект, который вы определили в массиве:
var a = {id: 'abc'},
b = {id: 'xyz'};
var index = [a, b].indexOf(a); // 0
спасибо за insite. –
Это не сработало, когда я попробовал. –
перебирать массив вроде этого:
for(var i = 0, len = x.length; i < len; i++) {
if (x[i].id === 'abc') {
console.log(i);
break;
}
}
В противном случае у вас будет чтобы указатели были одинаковыми для объектов, которые вы пытаетесь найти с помощью indexOf
Ниже самый замечательный способ: -
var indexId = x.map(function(e) { return e.id; }).indexOf('abc');
, как показано на this answer
Давайте есть хороший код здесь;)
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
, что это не проблема синтаксиса. [Два объекта с разными ссылками в памяти различаются в JS] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Comparison_Operators). –