2012-03-21 8 views
3

mapと(selectまたはdelete_if)に同時に良い方法がありますか?現時点では、私は次のいずれかをしますが、より良い方法があるかどうか疑問に思っていました。また、結果の配列内に偽の値が必要な場合は、2番目の値を使用できません。同時にマッピングと選択

some_array.select{|x| some_condition(x)}.map{|x| modification(x)} 

some_array.map{|x| modification(x) if some_condition(x)}.compact 
+1

似たような質問:http://stackoverflow.com/questions/5152098/skip-over-iteration-in-enumerablecollectでもよい回答はありません。 –

+0

[Rubyでは、 'select'と 'map'を組み合わせたArrayメソッドがありますか?](http://stackoverflow.com/questions/3371518/in-ruby-is-there-an-array-method -the-combines-select-and-map) - 良い答えがあります – fotanus

答えて

2

違いは、ブロックの最後に結果を配置する必要がないということです

new_array = some_array.each_with_object([]) do |m,res| 
    res << modification(x) if some_condition(x) 
end 

を減らすか、または注入とほぼ同じ。

+0

each_with_objectを知らなかった。ニート! – noodl

+0

ここで確認してください:http://ruby-doc.org/core-1.9.3/Enumerable.html#method-i-each_with_objectvvvvvv – megas

+0

@Kyle、これはチェックなしで元に戻すのは良くありません – megas

2

これはいかがですか?

new_array = some_array.inject([]) do |arr, x| 
    some_condition(x) ? arr << modification(x) : arr 
end 

いつでも、私はその後、等の拒否マッピング、その後の選択またはマッピングについて考える...、それは通常、私は仕事を得るためにenumerableを使用できることを意味します。

+0

ええと、素晴らしい解決策! – Jwosty

関連する問題