получить значения из массива ruby, если условие - PullRequest
3 голосов
/ 25 февраля 2012

Я сопоставляю массив с этим кодом:

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 значений, это значит, я хочу получить массив как:

["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 ]

9 голосов
/ 25 февраля 2012

Вы можете вызвать метод compact в массиве, чтобы удалить из него пустые результаты.

images_url = page.images.map{|img| img.url.to_s if (img.width.to_i > 200)}.compact
0 голосов
/ 25 февраля 2012

Вы также можете использовать Array # delete , если вы когда-либо захотите удалить другие вещи, кроме nil, без изменения получателя (добавьте удар [!], если хотите, чтобы он этого захотел).

Или, если вы хотите удалить элементы, основанные на чем-то отличном от соответствия, вы можете использовать Array # delete_if . Он перебирает каждый элемент с предоставленным вами блоком и удаляет элемент, есливозвращаемое значение этого блока оценивается как true.

Вот несколько примеров обоих:


    ary = [42, nil, "foo", "bar", "foo", Object.new, self, /hi/]
    ary.delete("foo")  #=> [42, nil, 'bar', #&ltObject: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"]

Надеюсь, это поможет!:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...