2011-12-23 9 views
8

No entiendo muy bien lo que está sucediendo aquí. Dada la matriz (arr):Oddness de Javascript con una matriz de objetos e indexOf

[ 
    { 
     "first_name": "Dan", 
     "last_name": "Woodson", 
     "id": 1 
    }, 
    { 
     "first_name": "Jen", 
     "last_name": "Woodson", 
     "id": 2 
    }, 
    { 
     "first_name": "Yoshi", 
     "last_name": "Woodson", 
     "id": 3 
    } 
] 

y el objeto (obj):

{ 
    "first_name": "Yoshi", 
    "last_name": "Woodson", 
    "id": 3 
} 

¿Por qué arr.indexOf(obj) retorno -1 (especialmente desde que recuperó el objeto a partir de la matriz mediante su parámetro 'id' antes en la función)?

+0

¿Qué quiere decir "al principio de la función"? Debe mostrarnos el código que escribió que falla, no solo algunos JSON. – Incognito

+0

¿Puedes publicar el código real que estás utilizando y/o ponerlo en un fsiddle? – jefflunt

+4

Esto es porque '({a: 12}) === ({a: 12})' es 'falso'. Los objetos en JavaScript son iguales si son el mismo objeto (misma referencia), no solo los mismos valores. –

Respuesta

5

Array.indexOf() solo funcionará en objetos si el objeto suministrado es exactamente el mismo objeto que pone en.

Un copia exacta es insuficiente, tiene que ser el exactamente el mismo objeto, es decir, tiene que haber algún objeto en la matriz de modo que:

arr[i] === obj 

Tiene que mostrar la forma en que se ha recuperado la objeto.

1

Me gustaría ver la función de recuperación, pero lo más probable es que no esté utilizando la misma referencia. Debido a que el siguiente es cierto:

var a = {id: 3}; 
var b = [a]; 
b.indexOf(a); // 0 
a.id = "not three"; 
b.indexOf(a); // still 0 

Sin embargo, la siguiente se romperá:

var a = {id: 3}; 
var b = [{id: 3}]; 
b.indexOf(a); // -1 not the same object 
Cuestiones relacionadas