2011-12-29 15 views
7

Duplicar posible:
indexOf method in an object array?problemas para usar indexOf en un complejo conjunto

que tienen una matriz de JavaScript que sigue este formato:

var arrayName = [ 
{id: "a", gender: "man", item: "stuff"}, 
{id: "b", gender: "woman", item: "stuff"}, 
{id: "c", gender: "man", item: "stuff"}, 
{id: "d", gender: "man", item: "stuff"} 
]; 

¿Hay alguna manera de que Puedo usar array.indexOf para encontrar un índice en la matriz, cuando, por ejemplo, conozco la variable "id".

Por ejemplo, lo intenté;

var position = arrayName.indexOf("b"); 
arrayName[position].gender = "man" 

Por el momento estoy usando;

for(var i=0; i<arrayName.length; i++) { 
    if(arrayName[i].id == "b"){ 
     arrayName[i].gender = "man"; 
    } 
} 

Esta segunda obra técnica, pero la matriz real que estoy usando tiene 150 entradas y 10 artículos en cada entrada de modo de bucle a través de él todo parece un gran desperdicio cuando sé que el "id" de la entrada quiero editar. indexOf sería un enfoque mucho más limpio si puedo hacerlo funcionar.

+2

Llamar indexOf en una matriz no es compatible con varios navegadores. – erturne

+0

@erturne - tienes razón - ni siquiera está en IE8 - wow –

+1

@erturne: No lo es, pero [como se indica en Mozilla Developer Network] (https://developer.mozilla.org/es/JavaScript/Reference/ Global_Objects/Array/indexOf), se puede implementar fácilmente incluso en navegadores antiguos/en desuso. – Tadeck

Respuesta

18

Su llamada a indexOf está comprobando los objetos en su matriz contra la cadena b, que nunca funcionará.

Looping a través de los elementos de la matriz para encontrar la identificación correcta es una solución simple.

O, usted podría hacer su propia función indexOf:

Array.prototype.indexOfId = function(id) { 
    for (var i = 0; i < this.length; i++) 
     if (this[i].id === id) 
      return i; 
    return -1; 
} 

    var arrayName = [ 
     { id: "a", gender: "man", item: "stuff" }, 
     { id: "b", gender: "woman", item: "stuff" }, 
     { id: "c", gender: "man", item: "stuff" }, 
     { id: "d", gender: "man", item: "stuff" }]; 

    var position = arrayName.indexOfId("b"); 

    alert(position); //alerts 1 

Aquí hay una fiddle

EDITAR

Si desea comparar los elementos de la matriz a cualquier propiedad, así es como se hazlo (ten en cuenta que estoy usando [] sintaxis para obtener una propiedad arbitraria)

Array.prototype.indexOfField = function (propertyName, value) { 
     for (var i = 0; i < this.length; i++) 
      if (this[i][propertyName] === value) 
       return i; 
     return -1; 
    } 

    var position = arrayName.indexOfField("id", "b"); 
    alert(position); //alerts 1 

    position = arrayName.indexOfField("gender", "man"); 
    alert(position); //alerts 0 

O, si usted no quiere meterse con el prototipo de la matriz, y no le importa el uso de características no presentes en los navegadores antiguos, se puede utilizar la función de matriz filter

var position = arrayName.indexOf(arrayName.filter(function (val) { 
     return val.id === "b"; 
})[0]); 

Tenga en cuenta que este función no está presente en IE8, y así apoyar a este navegador que tendría que agarrar el EDITAR shim from MDN

- Uy, indexOf no es amigable con navegadores antiguos tampoco.Si se opta por esta segunda parte del código y quería apoyar IE, también tendría que agarrar la cuña para indexOf from here

+0

Gracias Adam, eso es lo que sospechaba. Probablemente seguiré adelante y usaré una variación de tu técnica prototype.indexOfId, ya que este tipo de ediciones son bastante comunes, por lo que será más claro hacer referencia a una única función de prototipo. Mi variación probablemente será: Array.prototype.indexOfId = function (variable, value) { for (var i = 0; i Nick

+0

@ user1121506 - eso no funcionará - espera por otra edición –

+0

@ user1121506 - editado - el código en tu comentario fue 99.9% correcto, solo necesitas un pequeño ajuste. –

0

puede anular indexOf usando prototype

Array.prototype.indexOf = function(elem) { 
    for (var i = 0; i < this.length; i++){ 
     if (this[i].id === elem) 
      return i; 
    } 
    return -1; 
} 

var arrayName = [ 
{id: "a", gender: "man", item: "stuff"}, 
{id: "b", gender: "woman", item: "stuff"}, 
{id: "c", gender: "man", item: "stuff"}, 
{id: "d", gender: "man", item: "stuff"} 
]; 

alert(arrayName.indexOf("b")); 

violín: http://jsfiddle.net/r8rp9/1/

1

Si usted tiene la oportunidad, puede utilizar Array.prototype.filter:

var arrayName = [ 
    {id: "a", gender: "man", item: "stuff"}, 
    {id: "b", gender: "woman", item: "stuff"}, 
    {id: "c", gender: "man", item: "stuff"}, 
    {id: "d", gender: "man", item: "stuff"} 
]; 

console.log(arrayName.filter(function(i) { 
    return i.id === 'b'; 
})); 

Qué hará g ive:

[ { id: 'b', gender: 'woman', item: 'stuff' } ] 
+0

¿Qué sucede si quiero encontrar el índice y eliminar el elemento? –

+0

Simplemente 'devuelve i.id! == 'b';' en su lugar. – NiKo

Cuestiones relacionadas