2011-11-29 32 views
30

si tiene una matriz como:Javascript indexOf en una matriz de objetos

var myArray = [ 
       { 
        'color':'red', 
        'name': 'redName' 
       }, 
       { 
        'color':'blue', 
        'name': 'blueName' 
       }, 
       { 
        'color':'green', 
        'name': 'greenName' 
        }, 
       { 
        'color':'yellow', 
        'name': 'yellowName' 
       }, 
      ]; 

¿Cómo puedo obtener el índice de, por ejemplo, "azul"?

Respuesta

38
for(var i = 0; i < myArray.length; i++) { 
    if(myArray[i].color === 'blue') { 
    return i; 
    } 
} 

No hay manera "limpia" a menos que desee incluir una biblioteca de terceros. Underscore es bueno para cosas como esta.

+0

El enlace en esta respuesta está roto ahora. –

+0

@AndersonGreen reparado, ¡gracias! Además, esta respuesta es bastante antigua. Recomiendo Lodash ahora. ES5 también proporciona una implementación de find() nativo para el prototipo Array. –

0

Itere la matriz, buscando el valor dentro de cada objeto del elemento. JavaScript sin procesar no le da mucho para trabajar.

+0

... Supongo que no hay indexOf para una matriz multidimensional? – redconservatory

+2

@redconservatory Bueno, eso no es una matriz multidimensional. Pero no, no hay. Hay un montón de implementaciones que podría agregar al prototipo de matriz, o simplemente hacerlo manualmente. –

+0

no hay. Pero solo quiero asegurarme de que tienes algo claro aquí ... parece que tu pregunta es buscar la clave de un valor, que sería como array_search() de php. Pero "indexOf" es más parecido a strpos de php() en que busca ver si una cadena está dentro de otra cadena (y devuelve la posición de ocurrencia). –

9

No es una matriz multidimensional (o incluso una matriz dentada, que se utiliza en lugar de matrices multidimensionales en Javascript, ya que no existen). Esa es una matriz de objetos.

Puede recorrer los elementos de la matriz:

var index; 
for (var i = 0; i < myArray.length; i++) { 
    if (myArray[i].color == 'blue') { 
    index = i; 
    break; 
    } 
} 

Ahora la variable index contiene el valor 1, con su ejemplo dado.

+0

Buena lección sobre la matriz ... gracias. – redconservatory

2

Supongo que quiere decir en su ejemplo que debe devolver "1"? Aquí es una función para usted ...

<script type='text/javascript'> 
var myArray = [ 
       { 
        'color':'red', 
        'name': 'redName' 
       }, 
       { 
        'color':'blue', 
        'name': 'blueName' 
       }, 
       { 
        'color':'green', 
        'name': 'greenName' 
        }, 
       { 
        'color':'yellow', 
        'name': 'yellowName' 
       }, 
      ]; 
function getIndexOf(a,v) { 
    var l = a.length; 
    for (var k=0;k<l;k++) { 
    if (a[k].color==v) { 
     return k; 
     } 
    }      
    return false; 
} 

alert (getIndexOf(myArray,'blue')); 
</script> 
2

Por ejemplo así:

DEMO

Array.prototype.objIndexOf = function(val) { 
    var cnt =-1; 
    for (var i=0, n=this.length;i<n;i++) { 
     cnt++; 
     for(var o in this[i]) { 
     if (this[i].hasOwnProperty(o) && this[i][o]==val) return cnt; 
     } 
    } 
    return -1; 
} 
var myArray = [ 
       { 
        'color':'red', 
        'name': 'redName' 
       }, 
       { 
        'color':'blue', 
        'name': 'blueName' 
       }, 
       { 
        'color':'green', 
        'name': 'greenName' 
        }, 
       { 
        'color':'yellow', 
        'name': 'yellowName' 
       }, 
      ]; 
    alert(myArray.objIndexOf('blue')) 
+0

-1 no deberías extender los objetos nativos de javascript como Array – qodeninja

+0

1 año de antigüedad y te molestarás en rechazarlo. Shees. http://stackoverflow.com/questions/8859828/javascript-what-dangers-are-in-extendiendo-array-prototype Lo suficientemente bueno para MDN, lo suficientemente bueno para mí: https://developer.mozilla.org/en- US/docs/JavaScript/Reference/Global_Objects/Array/filter – mplungjan

+1

jaja, en realidad no voté =) porque ya era 0. 1 año después y esta pregunta todavía era relevante para algo que estaba buscando. – qodeninja

38

Si ya está utilizando ECMAScript 5 en su código que puede utilizar lo siguiente:

myArray 
    .map(function (element) {return element.color;}) 
    .indexOf('blue'); 

Tenga en cuenta que el apoyo a éstas funciones es bastante limitado (no funcionan en Internet Explorer 8).

Además, si usted está en el futuro, y está usando ES6 se puede hacer eso:

myArray.map((el) => el.color).indexOf('blue'); 

Ese es el mismo que el anterior, pero más pequeño.

+0

esta es una solución elegante – DariusVE

+2

"si estás en el futuro" felicitaciones! – Madivad

+0

es un gran trabajo –

12

Sé que esto es muy antiguo, pero es6 Javascript un método increíble Array.prototype.findIndex(), por lo que sólo podía hacer:

let index = myArray.findIndex((item) => item.color === 'blue'); 
// value of index will be "1" 
+0

perfec answert !!! – SagarPPanchal

-1

Puede utilizar .findIndex() method

En su caso

var findeMe = "blue"; 
myArray.findIndex(function(row){ 
return row.color == findMe; 
}); 

Espero que ayude

Cuestiones relacionadas