2012-09-23 9 views
22

Mam tablicy JavaScript obiektów tak:Pierwsze indeks elementu tablicy w oparciu o jego właściwości

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

Każdy obiekt posiada unikalny id wśród innych właściwości:

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

Jak mogę uzyskać indeks konkretnego obiektu w tej tablicy, jeśli znam tylko jego właściwość id? Więc jeśli wiem, że myArray[x].id == 4, jak mogę znaleźć x?

+0

ES6 Array.findIndex - patrz przykład poniżej pełną – yar1

Odpowiedz

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

IE poniżej wersji 9 map trzeba plaster, lub po prostu stosować pętlę.

+2

to wygląda najlepiej, miło. nawet o tym nie myślałem – jeremy

+2

Tego właśnie użyję, wielkie dzięki –

+0

To działa lepiej niż to, co miałem! – vinylDeveloper

7

Dlaczego po prostu zrobić pętlę?

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

Fakt, że istnieje wiele obiektów w JS (lub bibliotek js) nie oznacza, że ​​nie może, a czasami napisać pętlę. To szybkie i proste.

+2

Może powinieneś użyć czegoś innego niż 'indexO f' – jeremy

+0

Może to spowodować problemy w innym miejscu jego kodu; być może 'indexOfId()' lub coś w zamian? –

+0

@Nile: Nie, 'indexOf' tu nie działa - potrzebny jest' filter' – Bergi

0

Można użyć .reduce(), która pozwala zmniejszyć wartość Array do pojedynczej wartości.

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

Wartość -1 jest wartością domyślną, jeśli nie znaleziono zgodności.


Jeśli masz do tego wiele zastosowań, możesz chcieć utworzyć fabrykę funkcji.

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

A potem użyj tego w ten sposób.

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

Jeśli każdy jest unikalny identyfikator, można zrobić to tak:

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

Można też spróbować funkcji rekurencyjnej, choć użytkownika @ xdazz wygląda raczej atrakcyjny.

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

Albo z ES6 składnię:

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

lub

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)); 
Powiązane problemy