如果条件,从ruby数组中获取值

时间:2012-02-25 16:30:31

标签: ruby-on-rails ruby arrays

我正在使用以下代码映射数组:

url = "http://www.cnn.com"
page = Mechanize.new.get(url)
images_url = page.images.map{|img| img.url.to_s if (img.width.to_i > 200)}

我在控制台中得到了这个结果:

[nil, "http://i2.cdn.turner.com/cnn/dam/assets/110929092349-nelson-mandela-t1-main.jpg", nil, nil, nil, nil, nil, "http://i2.cdn.turner.com/cnn/dam/assets/120225123812-syria-mani-2-c1-main.jpg", nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, "http://i2.cdn.turner.com/cnn/dam/assets/120225022127-blue-fish-bin-tease.jpg", nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil]

我想要这个数组没有 nil 值,它的意思是,我想得到一个数组......:/ / p>

["http://i2.cdn.turner.com/cnn/dam/assets/110929092349-nelson-mandela-t1-main.jpg", "http://i2.cdn.turner.com/cnn/dam/assets/120225123812-syria-mani-2-c1-main.jpg", "http://i2.cdn.turner.com/cnn/dam/assets/120225022127-blue-fish-bin-tease.jpg"]

对于这种情况,有3个值。

谢谢

2 个答案:

答案 0 :(得分:9)

您可以调用Array上的compact方法从中删除空结果。

images_url = page.images.map{|img| img.url.to_s if (img.width.to_i > 200)}.compact

答案 1 :(得分:0)

如果您想删除nil以外的内容而不修改接收者,也可以使用Array#delete(如果您想要,请添加一个[!]。

或者,如果您想根据匹配以外的其他内容删除元素,则可以使用Array#delete_if。它使用您提供的块迭代每个元素,如果该块的返回值的计算结果为true,则删除该元素。

以下是两个例子:


    ary = [42, nil, "foo", "bar", "foo", Object.new, self, /hi/]
    ary.delete("foo")  #=> [42, nil, 'bar', #<Object:xxxxx&rt, main, /hi/]
    ary                #=> [42, nil, "foo", "bar", "foo", Object.new, self, /hi/]
    ary.delete_if {|elem|
      elem.class == Object or
      elem.kind_of?(Regexp)
    }                  #=> [42, nil, "foo", "bar", "foo"]

希望这有帮助! :)