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]

ただし、このメソッドでは、nil 値を取り除くために追加の .compact 呼び出しが必要です。

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

4

3 に答える 3

6

代わりにチェーンを使用して、最初にがselect存在するもののみを使用し、次に結果を::booltruemap: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おそらく最も読みやすいですが、次の方法で1つの関数呼び出しに進むことができます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 に答える