2016-04-15 9 views
-3

各ハッシュに2つの属性created_timeupdated_timeがあるハッシュの配列を並べ替える必要があります。これらの属性の値は、日付文字列またはnilのいずれかです。 created_time(ASC)とupdated_time(ASC)でソートしたいのですが、sort_byメソッドで試したところ、this discussionで提案されているソートメソッドのような複数のキーの条件を指定できませんでした。Ruby sort_by複数のフィールドにはゼロ値が含まれる可能性があります

二つの属性がCREATED_TIMEとupdated_timeが最後

としてNULL値で昇順にソートする配列が、私は

[ 
{"created_time"=>"2016-04-15", "updated_time"=>nil}, 
{"created_time"=>nil, "updated_time"=>"2016-04-09"}, 
{"created_time"=>nil, "updated_time"=>"2016-04-10"} 
] 

何として結果を望ん

[ 
{"created_time" => nil, "updated_time" => "2016-04-10"}, 
{"created_time" => nil, "updated_time" => "2016-04-09"}, 
{"created_time" => "2016-04-15", "updated_time" => nil} 
] 

ある場合と仮定何をする?仮定arr

+2

を考え出しvalues.And nilを持つことができます昇順に2つのキーを持つハッシュの配列をソートしたいですそれを特定する。あなたは試してみたことがありません。あなたが試したことを見せて、それがなぜ仕事をしなかったのか、あなたが立ち往生しているのかを尋ねます! – Ccr

+1

質問が完全に指定されていません。ソートされたリストの中で 'nil'値を持つ項目をどこに配置したいですか? – sawa

+0

@sawaソートされたリストの末尾にnil値を追加したい – Magesh

答えて

0

ctut)がfomat "YYYY-MM-DD" 又はnilと日付ストリングのいずれかであるハッシュ{"created_time"=>ct, "updated_time"=>ut}の配列です。 を、ctまたはutの日付文字列値より後であることが保証されている日付文字列とします。たとえば、far_away_time = "3000-01-01"となります。そして、次のようにEnumerable #sort_byを使用して並べ替えることができます。datestringsはISO 8601形式ですので

arr.sort_by do |h| 
    ct, ut = h.values 
    case [ct.nil?, ut.nil?] 
    when [true, true] then [far_away_time, far_away_time, far_away_time] 
    when [true, false] then [far_away_time, far_away_time, ut] 
    when [false, true] then [far_away_time, ct, far_away_time] 
    else [ct, ut, ""] 
    end 
end 

を、Dateオブジェクト(つまり、文字列自体をソートすることができます)に変換する必要はありません。たとえば、"2016-03-12" < "2016-03-13" #=> trueです。配列の順序については、Array#<=>のドキュメントを参照してください。

私はそれらを記載されている(およびソートされた配列の端部に配置された)を有するようにハッシュ{"created_time"=>"2016-01-01", "updated_time"=>nil}{"created_time"=>nil, "updated_time"=>"2016-01-01"}{"created_time"=>nil, "updated_time"=>nil}が順序付けされている順に3要素アレイで選別しています。

0

ご不明な点がございましたら、申し訳ありません。私はちょうどあなたが誰かができ、問題がある場合、それをここに投稿し、何かをしようとしている場合、私は道

 def date_time datestring 
     DateTime.parse(datestring) 
    end 

    result = array_to_sort.sort do |a,b| 
    (a["created_time"] && b["created_time"] && a["updated_time"] && b["updated_time"]) ? [ date_time(a["created_time"]), date_time(a["updated_time"])] <=> [ date_time(b["created_time"]), date_time(b["updated_time"])] : [ a["created_time"] && b["created_time"] ? date_time(a["created_time"]) : a["created_time"] ? -1 : 1, a["updated_time"] && b["updated_time"] ? date_time(a["updated_time"]) : a["updated_time"] ? -1 : 1] <=> [ a["created_time"] && b["created_time"] ? date_time(b["created_time"]) : b["created_time"] ? -1 : 1, a["updated_time"] && b["updated_time"] ? date_time(b["updated_time"]) : b["updated_time"] ? -1 : 1] 
    end 
関連する問題