2012-09-23 12 views
22

tengo una matriz de JavaScript de los objetos de esta manera:Conseguir índice del elemento de una matriz basada en sus propiedades

var myArray = [{...}, {...}, {...}]; 

Cada objeto tiene única id entre otras propiedades:

{ 
    id: 4, 
    property1: 'something', 
    property2: 'something' 
} 

¿Cómo puedo conseguir un índice de un objeto particular en esa matriz, si solo conozco su propiedad id? Entonces, si sé que myArray[x].id == 4, ¿cómo puedo encontrar x?

+0

ES6 Array.findIndex - véase el ejemplo completo a continuación – yar1

Respuesta

55
var index = myArray.map(function(el) { 
    return el.id; 
}).indexOf(4); 

Para IE debajo versión 9, map necesitan un parche, o simplemente utilizar un bucle.

+2

este se ve mejor, bien. Ni siquiera lo pensé – jeremy

+2

Ese es el que usaré, muchas gracias –

+0

¡Esto funciona mucho mejor de lo que tenía! – vinylDeveloper

7

¿Por qué no hacer simplemente un bucle?

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

El hecho de que hay muchas instalaciones en js js (o librerías) no quiere decir que no debe, a veces, escribir un bucle. Eso es rápido y simple.

+2

Tal vez deberías usar algo distinto que 'indexO f' – jeremy

+0

Es probable que esto cause problemas en otras partes de su código; tal vez 'indexOfId()' o algo en su lugar? –

+0

@Nile: No, 'indexOf' no funciona aquí - necesitaría' filter' – Bergi

0

Puede usar .reduce(), que le permite reducir un Array a un solo valor.

var obj_idx = myArray.reduce(function(idx, item, i) { 
    return item.id === 4 ? i : idx; 
}, -1); 

El -1 es un valor por defecto si no se encuentra ninguna coincidencia.


Si tiene múltiples usos para esto, es posible que desee hacer una fábrica de funciones.

function idxForID(target) { 
    return function(idx, item, i) { 
     return item.id === target ? i : idx; 
    }; 
} 

Y luego úsala así.

var obj_idx = myArray.reduce(idxForID(4), -1); 
0

Si cada id es único, puede hacerlo de esta manera:

o1 = {id:1} 
o2 = {id:2} 
o3 = {id:3} 
o4 = {id:4} 
a = [o1,o2,o3,o4] 
a.indexOf(a.filter(function(i){return i.id==4})[0]); 
0

También puede probar una función recursiva, aunque de @ xdazz parece bastante atractivo.

var indexOfId = function(arr, id, index) { 
    if (!index) { index = 0; } 
    if (arr[index].id == id) { 
     return index; 
    } 
    return ((index += 1) >= arr.length) ? -1 : indexOfId(arr, id, index); 
}; 
12

O con la sintaxis ES6:

let index = myArray.map((el) => el.id).indexOf(4) 

o

let index = myArray.findIndex((el) => el.id === 4) 
0

ES6 Array.findIndex

const myArray = [{id:1}, {id:2}, {id3}]; 
const foundIndex = myArray.findIndex((el) => (el.id === 3)); 
Cuestiones relacionadas