2013-09-05 74 views
6

Tôi đã một đối tượng có cấu trúc như thế này:Bắt một đối tượng từ _.pluck với lo-dash/nhấn

var my_object = { 
    first_item: {important_number: 4}, 
    second_item: {important_number: 6}, 
} 

Tuy nhiên, tôi muốn một đối tượng có cấu trúc như thế này:

{ 
    first_item: 4, 
    second_item: 6, 
} 

tôi dự kiến ​​có thể nhận được kết quả này với _.pluck:

_.pluck(my_object, "important_number") 

Nhưng điều này mang lại cho tôi:

[0: 4, 1: 6] 

Tốt, nhưng tôi cần tên thật của đối tượng. Tôi đã chơi đùa và kết thúc với điều này:

_.reduce(my_object, function(memo, val, key) { 
    memo[key] = val.content; 
    return memo; 
}, {}); 

Có hiệu quả mong muốn, nhưng không đơn giản như tôi muốn. Có một giải pháp tốt hơn trong gạch dưới/lodash, hoặc là tốt nhất nó sẽ nhận được?

+0

Vì tất cả các điều tra viên gạch dưới đều trả về mảng, đây là điều tốt nhất bạn sẽ nhận được (mặc dù bạn có thể ngắn hơn nhưng kém hiệu quả hơn như 'zip (keys (obj), pluck (values ​​(obj)," content "))'). – Bergi

+0

Tôi chỉ cần thiết lập một thử nghiệm JSPerf cho 2, và trong trình duyệt của tôi, tùy chọn của bạn nhanh hơn 2%! http://jsperf.com/getting-an-object-from-pluck – JJJollyjim

+0

Tuy nhiên, bạn đưa ra điều này: '[[" first_item ", 4], [" second_item ", 6]]' thay vì mong đợi '{ first_item: 4, second_item: 6} ' – JJJollyjim

Trả lời

8

Trong Lo-Dash bạn cũng có thể sử dụng _.transform, một thay thế mạnh mẽ hơn để _.reduce:

_.transform(my_object, function(memo, val, key) { 
    memo[key] = val.important_number; 
}); 
3

Tôi biết đó là thú vị để sử dụng Lo-Dash/gạch dưới, nhưng nếu bạn phải sử dụng 2 chức năng thay vì chỉ sử dụng một vòng lặp thường xuyên, bạn nên sử dụng 'old_school' phong cách mã hóa:

var data = { 
    first_item: {important_number: 4}, 
    second_item: {important_number: 6}, 
}; 

var obj = {}; 

for (var i in data) { 
    if (data.hasOwnProperty(i)) obj[i] = data[i].important_number; 
} 

Chỉ cần để chứng minh quan điểm của tôi, tôi cập nhật JsPerf bạn để bao gồm thường xuyên cho vòng lặp, và xem sự kỳ diệu: http://jsperf.com/getting-an-object-from-pluck/2

thường xuyên đối với vòng là ít nhất 2x nhanh hơn bất kỳ phương pháp nào khác các bạn đăng ở đây. Và đó là chủ yếu bởi vì nó chỉ đi qua đối tượng một lần.

+5

Xin chào, người duy trì jsPerf và Lo-Dash tại đây ; D. jsPerf của bạn không phải là ma thuật, nó chỉ đơn giản là nhanh hơn bởi vì nó có ít trừu tượng hơn, nhưng đó là không có gì mới. Các phương thức được đăng ở trên chỉ lặp lại đối tượng một lần, tuy nhiên chúng phải chịu chi phí thực hiện gọi lại và tổng quát hơn so với đoạn mã được nhắm mục tiêu của bạn. OP đang tìm kiếm một lựa chọn đơn giản hơn bằng cách sử dụng đường lib không mở nó sang JS kim loại trần. –

+0

Tôi không biết về '_.transform' - tuyệt vời để biết về nó (tôi sử dụng underscore.js chủ yếu). Dù sao nếu bạn có một giải pháp hàm 1 cho câu hỏi áp phích, đó là những gì anh ta muốn –

+0

Đây là giải pháp hàm số 1: '_.mapValues ​​(my_object," important_number ")' – TWiStErRob

5

thực tế những gì bạn đang mô tả - có nghĩa là "pluck cho các giá trị đối tượng" - có thể được viết như sau:

_.mapValues(my_object, "important_number") 

Xem tài liệu về _.mapValues.

_.createCallback - chuỗi nào để ma thuật thuộc tính - được sử dụng khắp nơi trong Lo-Dash: tìm kiếm "_.pluck" style callback.