Как проверить, соответствуют ли ключи хеша значению из массива - PullRequest
0 голосов
/ 24 января 2019

У меня есть:

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 голосов
/ 24 января 2019

Требуется только небольшое изменение:

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

См. Hash # select .

Переменная блока _ (допустимая локальная переменная), которая является значением ключа k, означает для читателя, что она не используется в расчете блока. Некоторые предпочитают писать, что |k,_v|, или что-то подобное.

0 голосов
/ 25 января 2019

Простой способ:

 ht.slice(*arr.map(&:to_sym))
# => {:test => "abc", :testing => "fun"}
0 голосов
/ 24 января 2019

Одной из опций является сопоставление (Enumerable#map) ключей в arr:

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"}]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...