1

使用我的哈希数组:

data = [{:bool => true, :val => 5}, {:bool => false, :val => 9}, {:bool => true, :val => 1}]

我想遍历数据并仅检索值数组。我可以:

data.map{|x| x[:val] if x[:bool]}

返回:

[5, nil, 1]

但是这个方法需要一个额外的 .compact 调用来摆脱 nil 值。

有没有更好的方法来实现这一目标?

4

3 回答 3

6

使用链接来代替首先select只有那些 where :boolis true,然后map是结果:val

data.select { |h| h[:bool] }.map { |h| h[:val] }  #=> [5, 1]
于 2012-05-10T17:25:54.980 回答
1

data.map { |x| x[:val] if x[:bool] }.compact可能是最容易阅读的,但您可以通过以下方式进行一个函数调用reduce

data.reduce([]) { |m,x| m << x[:val] if x[:bool]; m }
于 2012-05-10T17:16:15.117 回答
0

这似乎不是一种优雅的方式,但你可以试试这个:

data = [{:bool => true, :val => 5}, {:bool => false, :val => 9}, {:bool => true, :val => 1}]
result = Array.new
data.each do |b|
val = Hash.try_convert(b)[:val]
result.unshift(val)
end
于 2012-05-11T09:34:00.790 回答