Javascript Array.indexOf() muestra un comportamiento extraño cuando se aplica a una matriz de objetos

he creado el siguiente código http://jsfiddle.net/EbCUx/

var arr = [{a:1,b:2,c:3},{a:3,b:5,c:6}];
var a = arr[0];
alert(arr.indexOf(a));
var b = {a:1,b:2,c:3};
alert(arr.indexOf(b));

¿Por qué indexOf() devuelve -1 aunque los contenidos de a y b son iguales... Sé que a es un valor de referencia... Es esa la causa... ¿Alguien puede explicarme la razón exacta?

preguntado el 03 de mayo de 12 a las 20:05

Vincular un violín es útil, pero también incluye tu código en la pregunta, para que esta página siga siendo útil cuando el violín expire. -

porque los arreglos también son objetos, también sucede con ellos. creo que puedes modificar esta respuesta para que funcione con objetos -

3 Respuestas

Estás comparando 2 objetos diferentes que tienen los mismos valores en su interior, pero siguen siendo objetos diferentes desde una perspectiva de igualdad.

Tu código original:

<script>
    var arr = [{a:1,b:2,c:3},{a:3,b:5,c:6}];
    var a = arr[0];
    alert(arr.indexOf(a));
    var b = {a:1,b:2,c:3};
    alert(arr.indexOf(b));
</script>

Una versión actualizada que muestra cómo obtener una coincidencia en la comparación.

<script>
    var b = {a:1,b:2,c:3};
    var arr = [b,{a:3,b:5,c:6}];
    var a = arr[0];
    alert(arr.indexOf(a));
    alert(arr.indexOf(b));
</script>

Si desea comparar 2 objetos diferentes que tienen los mismos valores, debe hacerlo manualmente.

contestado el 03 de mayo de 12 a las 20:05

Desde DND:

indexOf compara searchElement con los elementos del Array usando igualdad estricta (el mismo método usado por el operador ===, o triple-igual).

Dado que nunca dos objetos son estrictamente iguales, no puede usar indexOf para buscar una matriz de objetos, debe hacer un bucle (o extender indexOf para bucle si los elementos de la matriz son objetos)

contestado el 03 de mayo de 12 a las 20:05

Usa esto en su lugar

agregue este código:

<script>
   Array.prototype.newIndexOf = function( item ) {
      var count = this.length;
      var j = 0;
      while (this[j++] !== item && j < count) {}
      return (j === count) ? -1 : j;
   }
</script>

indexOf es lento y no tiene un estricto control de igualdad.

http://jsperf.com/indexof-vs-equaling/2

respondido 04 mar '14, 05:03

indexOf en realidad utiliza un estricto control de igualdad! - A1rPun

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.