2011-11-24 43 views
11

Tôi đã đối tượng sau đâyphát hiện bởi chính đối tượng trong underscore.js

{ join: {} } 

Tôi muốn thấy nó là đối tượng mặc định từ mảng dưới đây

[ 
    { login: { label: 'Login', url: '#login' } }, 
    { join: { label: 'Join', url: '#join', theme: 'a' } }, 
    { home: { label: 'none', icon: 'home', url: '#', theme: 'a' } } 
] 

Tôi muốn lặp qua mảng và khớp với khóa, trong trường hợp này là 'join'.

Đây là những gì tôi có cho đến nay:

var butt_to_find = { join: {} } 
var all_buttons = 'array above' 
var matching = _.find(all_buttons, function(default_button){ 
return if default_butt key @ 1 is the same as butt_to_find key @ 1; 
    }); 

Đây là lần đầu tiên tôi đã sử dụng gạch dưới sau khi nghe rất nhiều về nó. Bất kỳ sự giúp đỡ, chào đón nhiều hơn

+3

Một nhỏ (off-topic) point: Bạn đang sử dụng 'label: 'none''. Chắc chắn 'label: null' (hoặc bỏ qua thuộc tính' label') sẽ là cách chính xác hơn để thể hiện điều này? Như được viết, tôi mong đợi từ "không" thực sự được hiển thị trong giao diện người dùng. – davidchambers

+0

Con trỏ tốt - cảm ơn – Chin

Trả lời

19
var buttons = [ 
    { login: { label: 'Login', url: '#login' } }, 
    { join: { label: 'Join', url: '#join', theme: 'a' } }, 
    { home: { label: 'none', icon: 'home', url: '#', theme: 'a' } } 
] 

_.find(buttons, function (button) { return 'join' in button }) 

Vấn đề là bạn đang sử dụng một cấu trúc dữ liệu tối ưu. Điều này có ý nghĩa hơn và tạo ra mã đơn giản hơn:

var buttons = { 
    login: {label: 'Login', url: '#login'}, 
    join: {label: 'Join', url: '#join', theme: 'a'}, 
    home: {label: 'none', icon: 'home', url: '#', theme: 'a'} 
} 

buttons.join // equivalent to the `_.find` line in the first example (but much simpler) 

Có lẽ bạn đang sử dụng mảng vì thứ tự các nút là quan trọng. Trong trường hợp này, tôi muốn sử dụng một mảng của mảng:

var buttons = [ 
    ['login', {label: 'Login', url: '#login'}], 
    ['join', {label: 'Join', url: '#join', theme: 'a'}], 
    ['home', {label: 'none', icon: 'home', url: '#', theme: 'a'}] 
] 

_.find(buttons, function (button) { return button[0] === 'join' }) 
+1

Cảm ơn các con trỏ - đã cho tôi suy nghĩ về cấu trúc dữ liệu thực sự hữu ích. – Chin

+11

FWIW (và một chút tắt chủ đề) nhưng tôi sẽ không sử dụng một mảng các mảng để giữ lại trật tự. Sử dụng một mảng các phím cho trật tự và keept các đối tượng nút như-là. var buttons = {...}; var buttonsOrder = ['login', 'join', 'home']; Bằng cách đó bạn chỉ phải lặp lại mảng khi bạn cần đơn đặt hàng và có thể thực hiện tra cứu ngay lập tức khi bạn cần mục đó. – webnesto

4
var matching = 
(_.find 
    (all_buttons, 
    function (button) 
    { return _.keys(butt_to_find)[0] in button; 
    } 
) 
); 

nơi _.keys(butt_to_find) đánh giá để ['join'] (một mảng chứa các phím của butt_to_find), _.keys(butt_to_find)[0] đánh giá để 'join' (phần tử đầu tiên của mảng cho biết), và _.keys(butt_to_find)[0] in button đánh giá cho một trong hai true hoặc false , tùy thuộc vào việc button có chứa 'join' làm khóa hay không. (The in operator là một nhà điều hành JavaScript thường xuyên, không phải cái gì thêm bởi underscore.js.)

+0

cảm ơn nhiều vì điều này – Chin

1
var def = {join: {}} 
var defs = [ 
    { login: { label: 'Login', url: '#login' } }, 
    { join: { label: 'Join', url: '#join', theme: 'a' } }, 
    { home: { label: 'none', icon: 'home', url: '#', theme: 'a' } } 
] 
_.find(defs,function(item,key){ 
    return _.has(item,_.keys(def)[0]) 
}) 

Bạn cũng có thể chuyển sang thư viện lodash (giảm trong phiên bản của dấu gạch dưới) và thực hiện điều này

_.compact(_.pluck(defs,_.keys(def)[0])) 
Các vấn đề liên quan