[英]How can I improve this Array.select in Ruby?
我只是寫了這行可怕的Ruby代碼,我想知道是否還有更好的方法。
我有一系列哈希,我想取其中一個。 我要選擇的“條件”是在兩個單獨的數組中-一個帶有鍵,另一個帶有值。 如果數組中的哈希對於keys
和values
每對都具有正確的key == value
values
,我想返回該哈希。
任何使代碼更具可讀性的指針?
arr = [
{:foo => 'foo', :bar => 'bar', :baz => 'baz'},
{:foo => 'bar', :bar => 'bar', :baz => 'bar'},
{:foo => 'foo', :bar => 'foo', :baz => 'foo'},
]
keys = [:foo, :bar]
values = ['foo', 'bar']
arr.select{|c| keys.map{|k| i = keys.index(k); c[keys[i]] == values[i]}.delete(false) != false}.first
# => {:foo => 'foo', :bar => 'bar', :baz => 'baz'}
您是否必須將要查找的內容指定為鍵數組和值數組? 如果這樣做,則將它們轉換為如下所示的哈希:
hsh = Hash[*keys.zip(values).flatten] #=> {:foo=>"foo", :bar=>"bar"}
然后選擇這樣:
arr.select { |c| c == c.merge(hsh) } #=> [{:foo=>"foo", :bar=>"bar", :baz=>"baz"}]
如果您可以首先指定要作為哈希表的內容,則不需要第一行。
arr = [
{foo:'foo', bar:'bar', baz:'baz'},
{foo:'bar', bar:'bar', baz:'bar'},
{foo:'foo', bar:'foo', baz:'foo'},
]
keys = [:foo, :bar]
values = ['foo', 'bar']
p arr.find { |c|
keys.zip(values).all? { |k,v|
c[k] == v
}
}
{foo:'bar'}
語法聲明哈希。 Enumerable#find
查找首次出現。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.