2013-11-14 4 views
2

Ошибка в следующем коде: -IndexOf (объект) в JavaScript

var x = [{id: 'abc'}, {id: 'xyz'}]; 

var index = x.indexOf({id: 'abc'}); 

Что синтаксис выше?

+1

, что это не проблема синтаксиса. [Два объекта с разными ссылками в памяти различаются в JS] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Comparison_Operators). –

ответ

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 
+4

'this [i] .k -> this [i] [k]'. – VisioN

+0

@VisioN Вы ничего не видели! : p –

+0

@ Kolink Да, да, да ... ';)' – VisioN

0
var o = {} 
var x = [o] 
console.log(x.indexOf(o)) 

С x.indexOf({}) вы создаете новый объект, на который не присутствует в массиве

3

Вы должны передать ссылку на точно такой же объект, который вы определили в массиве:

var a = {id: 'abc'}, 
    b = {id: 'xyz'}; 

var index = [a, b].indexOf(a); // 0 
+0

спасибо за insite. –

+0

Это не сработало, когда я попробовал. –

0

перебирать массив вроде этого:

for(var i = 0, len = x.length; i < len; i++) { 
    if (x[i].id === 'abc') { 
     console.log(i); 
     break; 
    } 
} 

В противном случае у вас будет чтобы указатели были одинаковыми для объектов, которые вы пытаетесь найти с помощью indexOf

1

Ниже самый замечательный способ: -

var indexId = x.map(function(e) { return e.id; }).indexOf('abc'); 

, как показано на this answer

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