Массив хэшей: проверяет наличие пары ключ-значение?

#ruby-on-rails #ruby

#ruby-on-rails #ruby

Вопрос:

запуск команды

 Company.first.employees.pluck(:roles)
  

выдает результат

 [{"admin"=>false, "editor"=>false, "viewer"=>false}, {"admin"=>true}] 
  

Как вы видите, это массив хэшей.

Как я могу проверить, содержит ли какая-либо из пар ключ-значение "admin"=>true ?

Я бы предположил, что это работает примерно так (не работает)

 Company.first.employees.pluck(:roles).values.include?("admin"=>true)
  

Желаемый результат получается, true/false если есть какие-либо ключевые значения с "admin"=>true .

Ответ №1:

Это должно сработать:

 Company.first.employees.pluck(:roles).any? { |roles| roles["admin"] }
  

В основном: для каждого элемента в Company.first.employees.pluck(:roles) проверьте, возвращает ли какой-либо из них true для roles["admin"] . Если они это сделают, вернется вся any? проверка true .

https://ruby-doc.org/core-2.7.1/Enumerable.html#method-i-any-3F

Комментарии:

1. Нет проблем! Enumerable Модуль отличный 🙂

Ответ №2:

 arr = [
  { "admin"=>false, "editor"=>false, "viewer"=>false },
  { "admin"=>true, "editor"=>false }
]
  

arr Содержит ли какой-либо элемент пару ключ-значение ["admin", true] ?

 arr.any? { |h| h["admin"] == true }
  #=> true
  

См. Перечислимый#any?.

Возвращает массив элементов arr , содержащих пару ключ-значение ["editor", false]

 arr.select { |h| h["admin"] == true }
  #=> [{"admin"=>true, "editor"=>false}]
  

Смотрите Array#select.

Подсчитайте количество элементов arr , которые содержат пару ключ-значение ["editor", false]

 arr.count { |h| h["editor"] == false }
  #=> 2
  

Смотрите Array#count.

Подсчитайте количество элементов, arr которые содержат пары ключ-значение ["editor", false] и ["viewer", false]

 arr.count { |h| h["editor"] == false amp;amp; h["viewer"] == false }
  #=> 1
  

Возвращает массив элементов arr , содержащих ключ "admin"

 arr.select { |h| h.key?("admin") }
  #=> [{"admin"=>false, "editor"=>false, "viewer"=>false},
  #    {"admin"=>true, "editor"=>false}]
  

Видите хэш #ключ? (он же has_key? )

Возвращает массив элемента arr , который содержит значение true

 arr.select { |h| h.value?(true) }
  #=> [{"admin"=>true, "editor"=>false}]
  

См. Хэш #значение? (он же has_value? )

Комментарии:

1. Вау, Кэри, это отличный ответ. Спасибо. Я обязательно вернусь к этому в будущем.