2012-06-17 36 views
23

Tôi cần phải tạo ra một vài đối tượng từ danh sách trong Javascript. Trong Python, tôi muốn viết những dòng này:Trong Javascript một từ điển hiểu, hoặc một Object `map`

{key_maker(x): val_maker(x) for x in a_list} 

Một cách khác để hỏi là không có tồn tại một cái gì đó giống như jQuery.map() mà tập hợp đối tượng? Dưới đây là dự đoán của tôi (không hoạt động):

var result = {} 
$.map(a_list, function(x) { 
    $.extend(result, {key_maker(x): val_maker(x)}) 
}) 
+1

FYI, 'bạn $ .extend' phiên bản sẽ không hoạt động. Số nhận dạng thuộc tính trong ký hiệu chữ đối tượng không được là kết quả của biểu thức. Mã này sẽ thất bại ... '{key_maker (x): val_maker (x)}' –

+1

@amnotiam Không nhận ra điều đó! Cảm ơn – Cuadue

Trả lời

23

Giả sử a_list là một Array, gần nhất có lẽ sẽ là sử dụng .reduce().

var result = a_list.reduce(function(obj, x) { 
    obj[key_maker(x)] = val_maker(x); 
    return obj; 
}, {}); 

Khả năng nhận dạng mảng có thể xuất hiện trong phiên bản JavaScript trong tương lai.


Bạn có thể vá bản triển khai không tuân thủ ES5 với compatibility patch from MDN.


Nếu a_list không phải là một mảng, nhưng một đối tượng đơn giản, bạn có thể sử dụng Object.keys() để thực hiện các hoạt động tương tự.

var result = Object.keys(a_list).reduce(function(obj, x) { 
    obj[key_maker(a_list[x])] = val_maker(a_list[x]); 
    return obj; 
}, {}); 
+0

Nếu sử dụng một phiên bản JS không có 'reduce', tôi cũng không nghĩ jQuery đã thêm nó nữa. Nhưng gạch dưới có nó. –

+0

@MarkReed: Đúng vậy. Tôi đã cập nhật với một liên kết đến bản vá tương thích MDN. –

+0

jQuery không có giảm (chưa). Bạn có thể tìm thấy một số triển khai trong trac của nó tại đây: http://bugs.jquery.com/ticket/1886 –

2

Câu hỏi cũ, nhưng câu trả lời đã thay đổi đôi chút trong các phiên bản Javascript mới. Với ES2015 (ES6), bạn có thể đạt được một đối tượng hiểu một lót như thế này:

a_list.reduce((obj, x) => Object.assign(obj, { [key_maker(x)]: value_maker(x) }), {}) 
2

ES5 giới thiệu Map cho một OrderedDict. Một Map hiểu có thể trông giống như:

Map(Array.map(function(o){return[ key_maker(o), val_maker(o) ]})) 

Ví dụ:

> a_list = [ {x:1}, {x:2}, {x:3} ] 
< [ Object, Object, Object ] 
> 
> let dict = new Map(a_list.map(function(o){return[ o.x, o.x**2 ]})) 
< Map[3] 
< 0 : {1 => 1} 
< 1 : {2 => 4} 
< 2 : {3 => 9} 
> 
> dict.get(2) 
< 4 
Các vấn đề liên quan