0
array = [{ name:'Joe', foo:'bar' },
         { name:'Bob', foo:''    },
         { name:'Hal', foo:'baz' }
        ]

fooが空の場合、それを最後に配置し、他の要素の順序を変更しないように並べ替える雄弁な方法は何ですか?

Ruby 1.9.3

4

5 に答える 5

5
array.partition { |h| !h[:foo].empty? }.flatten
于 2013-02-12T23:35:12.383 に答える
1
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? })
于 2013-02-12T23:28:10.223 に答える
1
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=>""}]
于 2013-02-12T23:29:58.393 に答える
1

キーをタプルとして生成できます。最初の部分は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

これは、他のいくつかの回答のすべてのグロス配列変異を回避し、純粋な関数変換から構築されていることに注意してください。

于 2013-02-13T06:09:02.220 に答える
0
array.each_with_index do |item, index|
  array << (array.delete_at(index)) if item[:foo].blank?
end

の代わりにあなたが持っているものを使用してくださいblank?

于 2013-02-12T23:28:59.907 に答える