array = [{ name:'Joe', foo:'bar' },
{ name:'Bob', foo:'' },
{ name:'Hal', foo:'baz' }
]
fooが空の場合、それを最後に配置し、他の要素の順序を変更しないように並べ替える雄弁な方法は何ですか?
Ruby 1.9.3
array = [{ name:'Joe', foo:'bar' },
{ name:'Bob', foo:'' },
{ name:'Hal', foo:'baz' }
]
fooが空の場合、それを最後に配置し、他の要素の順序を変更しないように並べ替える雄弁な方法は何ですか?
Ruby 1.9.3
array.partition { |h| !h[:foo].empty? }.flatten
array = [
{ name:'Joe', foo:'bar' },
{ name:'Bob', foo:'' },
{ name:'Hal', foo:'baz' }
]
arraydup = array.dup
array.delete_if{ |h| h[:foo].empty? }
array += (arraydup - array)
その結果:
[
[0] {
:name => "Joe",
:foo => "bar"
},
[1] {
:name => "Hal",
:foo => "baz"
},
[2] {
:name => "Bob",
:foo => ""
}
]
少しリファクタリングして:
array += ((array.dup) - array.delete_if{ |h| h[:foo].empty? })
array.find_all{|elem| !elem[:foo].empty?} + array.find_all{|elem| elem[:foo].empty?}
戻り値
[{:name=>"Joe", :foo=>"bar"}, {:name=>"Hal", :foo=>"baz"}, {:name=>"Bob", :foo=>""}]
キーをタプルとして生成できます。最初の部分はnull/not nullを示し、2番目の部分は元のインデックスであり、次にsort_by [nulls_last、original_index]です。
def sort_nulls_last_preserving_original_order array
array.map.with_index.
sort_by { |h,i| [ (h[:foo].empty? ? 1 : 0), i ] }.
map(&:first)
end
これは、他のいくつかの回答のすべてのグロス配列変異を回避し、純粋な関数変換から構築されていることに注意してください。
array.each_with_index do |item, index|
array << (array.delete_at(index)) if item[:foo].blank?
end
の代わりにあなたが持っているものを使用してくださいblank?
。