2012-09-23 2 views
22

Tôi có một mảng JavaScript của các đối tượng như thế này:Bắt chỉ số yếu tố của một mảng dựa trên thuộc tính của nó

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

Mỗi đối tượng có độc đáo id trong những khách sạn khác:

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

Làm thế nào tôi có thể nhận được chỉ mục của một đối tượng cụ thể trong mảng đó, nếu tôi chỉ biết thuộc tính id của nó? Vì vậy, nếu tôi biết rằng myArray[x].id == 4, làm thế nào tôi có thể tìm thấy x?

+0

ES6 Array.findIndex - xem ví dụ đầy đủ dưới đây – yar1

Trả lời

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

Đối với IE dưới phiên bản 9, map cần một bản vá, hoặc chỉ sử dụng một vòng lặp.

+2

điều này có vẻ tốt nhất, tốt đẹp. thậm chí không nghĩ về nó – jeremy

+2

Đó là cái tôi sẽ sử dụng, cảm ơn rất nhiều –

+0

Cách này hoạt động tốt hơn những gì tôi đã từng làm! – vinylDeveloper

7

Tại sao không chỉ tạo vòng lặp?

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

Thực tế là có nhiều tiện ích trong thư viện js (hoặc js) không có nghĩa là bạn không được, đôi khi viết một vòng lặp. Đó là nhanh chóng và đơn giản.

+2

Có lẽ bạn nên sử dụng một cái gì đó khác hơn 'indexO f' – jeremy

+0

Điều này có thể gây ra sự cố ở nơi khác trong mã của anh ấy; có lẽ 'indexOfId()' hay cái gì đó thay thế? –

+0

@Nile: Không, 'indexOf' không hoạt động ở đây - bạn cần' filter' – Bergi

0

Bạn có thể sử dụng .reduce(), cho phép bạn giảm một mảng xuống một giá trị duy nhất.

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

-1 là giá trị mặc định nếu không tìm thấy kết quả phù hợp.


Nếu bạn có nhiều công dụng cho điều này, bạn có thể muốn tạo một nhà máy chức năng.

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

Và sau đó sử dụng nó như thế này.

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

Nếu mỗi id là duy nhất, bạn có thể làm điều đó như thế này:

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

Bạn cũng có thể thử một hàm đệ quy, mặc dù @ xdazz của ngoại hình khá hấp dẫn.

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

Hoặc với cú pháp ES6:

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

hoặc

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));