2011-05-01 28 views
0

我有兩個數組。一個是一組技能,另一個是用戶可以做的一套技能。爲了說明:注意數組差異 - Ruby

['swimming', 'rowing', 'cycling'] is the set of all skills 

現在,用戶可以擁有一套像技巧:

['rowing', 'cycling'] 

如何創建一個漂亮的哈希將呈現一個用戶是否有目前的技術?對於這個特定的用戶,它將是:

{'swimming' => no, 'rowing' => yes, 'cycling', => yes} 

P.S.我其實想用軌道中的活動記錄對象來做到這一點,但我想這是同一個想法。

回答

6

下面將爲truefalse代替yesno

all_skills = %w[swimming rowing cycling] 
user_skills = %w[rowing cycling] 

Hash[all_skills.map{|k| [k, user_skills.include?(k)]}] 

,或者,如果你不介意nil,而不是爲no情況下,下面是快。

Hash[user_skills.map{|k| [k, true]}]} 
3

這裏有一個簡潔的方式來做到這一點:

ALL_SPORTS = ['swimming', 'rowing', 'cycling'] 

user_array = ['rowing', 'cycling'] 
user_hash = ALL_SPORTS.inject(Hash.new) { |h, sport| {sport => user_array.include?(sport)}.merge(h) } 
2

我假設當你說'是'和'否'你真的想要布爾值。以下不使用任何中間值,僅依賴於用戶的定義運動:

> h = Hash.new(false).merge(Hash[%w[rowing swimming].map {|v| [v.to_sym, true]}]) 
=> {:rowing=>true, :swimming=>true} 

現在,如果你調用任何其他運動的一個關鍵是,用戶沒有你得到期望的結果:

> h[:golf] 
=> false 

這也假設你也需要鍵的符號。