фильтровать массив хешей с массивом ключей ruby - PullRequest
0 голосов
/ 22 апреля 2020
arr = [
  {
    :id=>2,
    :start=> "3:30",
    break: 30,
    num_attendees: 14
  },
  {
    id: 3,
    start: "3: 40",
    break: 40,
    num_attendees: 4
  },
  {
    id: 4,
    start: "4: 40",
    break: 10,
    num_attendees: 40
  }
]

Когда я делаю следующее

arr.map do |hash|
 [ hash[:id], hash[:start] ]
end

возвращает

#=> [[2, "3:30"], [3, "3: 40"], [4, "4: 40"]]

Существует ли элегантный и эффективный способ передачи массива типа return_keys = [:id, :start] и получения того же самого выше значения, а не жесткое кодирование внутри array.map

Ответы [ 2 ]

1 голос
/ 22 апреля 2020

Я считаю следующее действительно выразительным

keys = [:id, :start]
arr.map {|hash| hash.slice(*keys).values}

Метод slice возвращает га sh только с ключами, переданными в качестве параметров (которым предшествует оператор * для преобразования массива в ключевое слово аргументы и избежать жесткого кодирования). Затем метод values получает только значения из га sh

1 голос
/ 22 апреля 2020

Считаете ли вы следующее элегантным и эффективным?

arr.map { |h| h.values_at(:id, :start) }
#=> [[2, "3:30"], [3, "3: 40"], [4, "4: 40"]]

или

arr.map { |h| h.values_at(*return_keys) }
#=> [[2, "3:30"], [3, "3: 40"], [4, "4: 40"]]
...