2012-09-23 10 views
22

ho un array JavaScript di oggetti come questo:Ottenere indice elemento di un array sulla base delle sue proprietà

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

Ogni oggetto ha unica id tra le altre proprietà:

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

Come posso ottenere un indice di un particolare oggetto in quell'array, se conosco solo la sua proprietà id? Quindi, se so che myArray[x].id == 4, come posso trovare x?

+0

ES6 Array.findIndex - vedi esempio di seguito completo – yar1

risposta

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

Per IE di seguito la versione 9, map bisogno di una patch, o semplicemente utilizzare un ciclo.

+2

questo sembra il migliore, bello. non l'ho nemmeno pensato – jeremy

+2

Questo è quello che userò, grazie mille –

+0

Questo funziona molto meglio di quello che stavo andando! – vinylDeveloper

7

Perché non fare semplicemente un ciclo?

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

Il fatto che ci sono molte strutture in js (o librerie JS) non significa che non si deve, a volte, scrivere un ciclo. È veloce e semplice.

+2

Forse si dovrebbe usare qualcosa di diverso di 'indexO f' – jeremy

+0

Questo potrebbe causare problemi altrove nel suo codice; forse 'indexOfId()' o qualcosa invece? –

+0

@Nile: No, 'indexOf' non funziona qui - saresti necessario' filter' – Bergi

0

È possibile utilizzare .reduce(), che consente di ridurre una matrice fino a un valore singolo.

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

Il -1 è un valore predefinito se non viene trovata alcuna corrispondenza.


Se si dispone di più usi per questo, si consiglia di rendere una funzione di fabbrica.

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

E quindi utilizzarlo in questo modo.

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

Se ogni ID è unico, si può fare in questo modo:

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

Si potrebbe anche provare una funzione ricorsiva, anche se di @ xdazz sembra piuttosto interessante.

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 sintassi 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)); 
Problemi correlati