RoR/Ruby удаляет элементы nil из вложенного массива
Чтобы разбить массив на две равные части, я бы сделал это,
>> 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]]
Теперь у меня есть вложенный массив, который содержит элементы nil, если размер массива нечетный. Как удалить элементы nil из вложенных массивов? Я хочу сделать что-то вроде:
a.compact
Но, к сожалению, это не работает, Ruby удаляет только нулевые элементы на первом уровне, а не рекурсивно. Имеет ли рубин какие-либо хорошие решения для этой проблемы?
Ответы
Ответ 1
С 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}
Ответ 2
Если вы использовали in_groups_of
, вы можете передать его false
в качестве второго аргумента и не заполнить "пробелы" с nil
, но на самом деле ничего.
Ответ 3
Если вы не хотите постоянно изменять
a.map do |e|
e.compact
end
Ответ 4
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]]
Ответ 5
a.each {|subarray| subarray.compact!}
a.compact!
Должен работать....