2012-05-10 10 views
1

ハッシュの配列が与えられていると、別のキーで評価中にハッシュの1つのキーでselectを使用するにはどうすればよいですか?ハッシュの私の配列で

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

私はデータを反復処理し、値のみの配列を取得したいと思います。私が行うことができます。

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

[5, nil, 1] 

をしかし、この方法がnilの値を取り除くために、追加の.compactコールを必要とします。

これを達成するより良い方法はありますか?

+3

'collect'ではなく' select'を使用してもよろしいですか? – Flexoid

答えて

6

使用:valに最初selectに代わりのみ:booltrueであり、その後、map結果の連鎖:

data.select { |h| h[:bool] }.map { |h| h[:val] } #=> [5, 1] 
1

data.map { |x| x[:val] if x[:bool] }.compactはおそらく読みするのが最も簡単ですが、あなたはreduceを介して関数呼び出しにまで行くことができます:

data.reduce([]) { |m,x| m << x[:val] if x[:bool]; m } 
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 
関連する問題