RoR / Ruby удаляет ноль элементов из вложенного массива - PullRequest
14 голосов
/ 26 ноября 2009

Чтобы разбить массив на две равные части, я бы сделал это,

>> a = [1,2,3,4,5]
=> [1, 2, 3, 4, 5]
>> a.in_groups_of( (a.size/2.0).ceil ) if a.size > 0
=> [[1, 2, 3], [4, 5, nil]]

Теперь у меня есть вложенный массив, который содержит ноль элементов, если размер массива нечетный. Как я могу удалить нулевые элементы из вложенных массивов? Я хочу сделать что-то вроде

a.compact

Но, к сожалению, это не работает, ruby ​​удаляет только нулевые элементы на первом уровне, а не рекурсивно. Предоставляет ли ruby ​​хорошие решения для этой проблемы?

Ответы [ 5 ]

44 голосов
/ 26 ноября 2009

В Ruby 1.8.7 и более поздних версиях вы можете выполнять следующие действия:

a.each &:compact!
=> [[1, 2, 3], [4, 5]]

В Ruby 1.8.6 вам придется проделать долгий путь:

a.each {|s| s.compact!}

Оба из них изменят содержимое a. Если вы хотите вернуть новый массив и оставить оригинал в покое, вы можете использовать collect вместо each:

# 1.8.7+:
a.collect &:compact

# 1.8.6:
a.collect {|s| s.compact}
8 голосов
/ 26 ноября 2009

Если вы используете in_groups_of, вы можете передать его false в качестве второго аргумента, и он не заполнит "пробелы" nil, но на самом деле ничего.

3 голосов
/ 26 ноября 2009

Если вы не хотите навсегда изменить a

a.map do |e|
  e.compact
end
0 голосов
/ 30 марта 2016
arr_mixed=['hello', 2222, 'world', nil, [1, 2, 5, 'hi', nil],[1, 2, 3], [4,   5, nil]]

def compact_nested(array)
   arr2=[]
   array.each { |x|
   element = x.class==Array ? x.compact : x
   arr2<<element
   }
   arr2
end

p compact_nested(arr_mixed).compact #=>["hello", 2222, "world", [1, 2, 5, "hi"], [1, 2, 3], [4, 5]]
p arr_mixed #=>["hello", 2222, "world", nil, [1, 2, 5, "hi", nil], [1, 2, 3], [4, 5, nil]]
0 голосов
/ 26 ноября 2009
a.each {|subarray| subarray.compact!}
a.compact!

Должно работать ....

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