在Ruby中使用Map和Select方法迭代遍历数组

时间:2013-01-03 16:16:38

标签: ruby-on-rails ruby ruby-on-rails-3

我正在开发一个应用程序,我坚持使用以下代码。

我有一个链接数组,其中包含用户在表单中发布的一些链接。 例如,我的数组是bunch1 = ["google.com","http://yahoo.com"]

现在,在将它们存储到数据库之前,我需要确保每个链接在开头都添加了“http://”,因为我的ActiveRecord对象中有'validate:'逻辑。

所以我的逻辑是我将迭代数组并检查数组中每个链接之前是否存在“http://”字符串段。很明显,我必须在我的数组中的“google.com”之前添加“http://”字符串段。

所以我写了这样的代码:

bunch2=bunch1.map { |y| y="http://"+y }

但它创建了一个像bunch2 = [“http://google.com”,“http:// http://yahoo.com”]

的束2数组

如您所见,它在“http://yahoo.com”之前添加了额外的“http://”。

为了解决这个问题,我修改了上面这样的代码:

bunch2 = bunch1.select { |x|  x !~ /http/ }.map { |y| y="http://"+y }

但它正在生成一个类似的数组 bunch2 = ["http://google.com"]因为使用select方法的正则表达式正在消除yahoo.com

有人可以帮我解决这个问题。提前谢谢......

2 个答案:

答案 0 :(得分:5)

为什么不在map的电话中进行测试?

bunch2 = bunch1.map {|y| y !~ /^http/ ? "http://#{y}" : y }

答案 1 :(得分:0)

好的,伙计们,我找到了解决这个问题的方法。所以代码根本不需要select方法。它只需要一个三元运算符。所以我的一个班轮代码是这样的: -

@bunch2=@bunch1.map { |x| x.match(/http:/) ? x : "http://"+x }

上面的代码使用match方法匹配正则表达式。如果找到匹配,则元素不变,否则在开头添加“httP://”字符串。