首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Ruby中,有组合'select‘和'map’的Array方法吗?

在Ruby中,有组合'select‘和'map’的Array方法吗?
EN

Stack Overflow用户
提问于 2010-07-30 20:48:19
回答 14查看 66.2K关注 0票数 104

我有一个包含一些字符串值的Ruby数组。我需要:

查找与某个谓词匹配的所有元素通过transformation

  • Return
  1. as a transformation
  2. Return

运行匹配的元素

现在我的解决方案是这样的:

def example
  matchingLines = @lines.select{ |line| ... }
  results = matchingLines.map{ |line| ... }
  return results.uniq.sort
end

是否有Array或Enumerable方法将select和map组合到单个逻辑语句中?

EN

回答 14

Stack Overflow用户

回答已采纳

发布于 2010-07-30 20:57:41

我通常将mapcompact与我的选择标准一起使用,作为后缀ifcompact摆脱了nils。

jruby-1.5.0 > [1,1,1,2,3,4].map{|n| n*3 if n==1}    
 => [3, 3, 3, nil, nil, nil] 


jruby-1.5.0 > [1,1,1,2,3,4].map{|n| n*3 if n==1}.compact
 => [3, 3, 3] 
票数 118
EN

Stack Overflow用户

发布于 2019-06-12 22:59:39

Ruby 2.7+

现在有了!

Ruby2.7正是为了这个目的引入了filter_map。它是惯用的,性能很好,我希望它很快就会成为常态。

例如:

numbers = [1, 2, 5, 8, 10, 13]
enum.filter_map { |i| i * 2 if i.even? }
# => [4, 16, 20]

这是一个good read on the subject

希望这对某些人有用!

票数 62
EN

Stack Overflow用户

发布于 2013-07-17 22:59:05

为此,您可以使用reduce,它只需要一次传递:

[1,1,1,2,3,4].reduce([]) { |a, n| a.push(n*3) if n==1; a }
=> [3, 3, 3] 

换句话说,将状态初始化为您想要的状态(在我们的例子中,是一个要填充的空列表:[]),然后始终确保返回这个值,并对原始列表中的每个元素进行修改(在我们的例子中,修改后的元素被推入列表)。

这是最有效的,因为它只通过一次遍历列表(map + selectcompact需要两次遍历)。

在您的案例中:

def example
  results = @lines.reduce([]) do |lines, line|
    lines.push( ...(line) ) if ...
    lines
  end
  return results.uniq.sort
end
票数 55
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3371518

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档