如何检查哈希键是否匹配数组中的值

时间:2019-01-24 18:39:58

标签: arrays ruby hash

我有:

arr = ['test', 'testing', 'test123']
ht = {"test": "abc", "water": "wet", "testing": "fun"}

如何在ht中选择键匹配arr的值?

ht_new = ht.select {|hashes| arr.include? hashes}
ht_new # => "{"test": "abc", "testing": "fun"}"

此外,我们如何从以下位置返回值:

arr = ["abc", "123"]
ht = [{"key": "abc", "value": "test"}, {"key": "123", "value": "money"}, {"key": "doremi", "value": "rain"}}]
output # => [{"key": "abc", "value": "test"}, {"key": "123", "value": "money"}]

3 个答案:

答案 0 :(得分:4)

只需稍作更改:

ht.select { |k,_| arr.include? k.to_s }
  ##=> {:test=>"abc", :testing=>"fun"}

请参见Hash#select

块变量_(有效的局部变量),它是键k的值,向读者表示该变量未在块计算中使用。有些人更喜欢写|k,_v|或类似的东西。

答案 1 :(得分:2)

一个选项是映射(Enumerable#maparr中的键:

arr.map.with_object({}) { |k, h| h[k] = ht[k.to_sym] }

#=> {"test"=>"abc", "testing"=>"fun", "test123"=>nil}

如果要去除具有nil值的对:

arr.map.with_object({}) { |k, h| h[k] = ht[k.to_sym] if ht[k.to_sym] }

#=> {"test"=>"abc", "testing"=>"fun"}


这是最后一个请求的选项:

ht.select{ |h| h if h.values.any? { |v| arr.include? v} }
# or
arr.map { |e| ht.find { |h| h.values.any?{ |v| v == e } } }

#=> [{:key=>"abc", :value=>"test"}, {:key=>"123", :value=>"money"}]

答案 2 :(得分:1)

一种直接的方法是:

 ht.slice(*arr.map(&:to_sym))
# => {:test => "abc", :testing => "fun"}