Frage

Um ein Array in zwei gleiche Teile geteilt würde ich tun dies,

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

Jetzt habe ich eine verschachtelte Array bekommt die Null-Elemente, wenn die Größe des Arrays enthält ungerade ist. Wie kann ich die Null-Elemente aus dem verschachtelten Arrays entfernen? Ich möchte etwas tun, wie,

a.compact

Aber leider, das nicht funktioniert, Rubin entfernt nur Null-Elemente auf der ersten Ebene und nicht rekursiv. Hat Rubin keine schöne Lösung für dieses Problem bieten?

War es hilfreich?

Lösung

Mit Ruby-1.8.7 und später können Sie wie folgt vor:

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

Mit Ruby-1.8.6, müssen Sie tun dies dem langen Weg:

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

Beide werden die Inhalte von a ändern. Wenn Sie ein neues Array zurückkehren wollen und lassen Sie das Original allein, können Sie collect statt each verwenden:

# 1.8.7+:
a.collect &:compact

# 1.8.6:
a.collect {|s| s.compact}

Andere Tipps

Wenn Sie die in_groups_of passieren kann es als zweites Argument false und es wird in den „Leerstellen“ mit nil, aber wirklich nichts.

nicht füllen

Es sei denn, Sie wollen dauerhaft ändern a

a.map do |e|
  e.compact
end
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]]
a.each {|subarray| subarray.compact!}
a.compact!

Sollte funktionieren ....

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top