2012-03-21 43 views
3

是否有一个很好的方式来map和(selectdelete_if)在同一时间?目前,我做了以下任一项,但想知道是否有更好的方法。另外,如果我想在结果数组中使用一个falsy值,我不能使用第二个。映射和选择在同一时间

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但没有很好的答案。 – 2012-03-22 01:32:04

+0

可能的重复[在Ruby中,是否有一个数组方法,结合'选择'和'地图'?](http://stackoverflow.com/questions/3371518/in-ruby-is-there-an-array-method -that-c​​ombine-select-and-map) - 有更好的答案 – fotanus 2014-06-26 02:54:26

回答

2

几乎相同,以减少或注入

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

不同的是,你不需要把结果在块的结尾。

+0

不知道each_with_object。整齐! – noodl 2012-03-22 00:26:54

+0

在这里检查:http://ruby-doc.org/core-1.9.3/Enumerable.html#method-i-each_with_objectvvvvvv – megas 2012-03-22 00:30:56

+0

@凯尔,这是不好的撤消没有检查 – megas 2012-03-22 00:35:29

2

这个怎么样?

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

每当我想到测绘然后选择或映射然后拒绝等等,这通常意味着我可以使用enumerable来完成这项工作。

+0

嗯,很好的解决方案! – Jwosty 2012-03-22 00:01:50