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
你认为下面的做法是否优雅而有效?
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"]]
我觉得下面的内容很有表现力
keys = [:id, :start]
arr.map {|hash| hash.slice(*keys).values}
该 slice
方法只返回一个包含作为参数传递的键的哈希值(前面有*运算符,以将数组转换为关键字参数,避免硬编码)。然后,该 values
方法只得到哈希中的值。