2016-10-12 18 views
1

:referenceの値に基づいてソートしたいハッシュの配列があります。しかし、配列内のいくつかの要素には:referenceキーがないため、ソートすることはできません。このフィールドを無視し、このキーを含むハッシュ要素を並べ替える方法はありますか?ruby​​ sorting hashes inside array

私は、次のアプローチを試みたが、私は正しい出力は次のようになります。引数エラーに

ArgumentError: comparison of NilClass with String failed 
    sort_by at org/jruby/RubyEnumerable.java:503 



arr1 = [{:reference=> "F123", 
      :name=> "test4" 
      }, 
      { 
      :reference=> "ZA4", 
      :name=> "test3" 
      }, 
      { 
      :reference=> "A43", 
      :name=> "test2" 
      }, 
      { 
      :name=> "test1" 
      }, 
      { 
      :name=> "homework1" 
      }] 

arr1 = arr1.sort_by { |hash| hash[:reference] } 

puts arr1 

を取得しています:

=> arr1= [ 
     {:reference=>"A43", :name=>"test2"}, 
     {:reference=>"F123", :name=>"test4"}, 
     {:reference=>"ZA4", :name=>"test3"}, 
     {:name=> "test1"}, 
     {:name=> "homework1"} 
     ] 

答えて

3

あなただけソートすることができた値にすることができます比較すると、異なるタイプの値を持っている場合は、まずそれらを同じタイプに変換することをお勧めします。簡単な回避策は、文字列に変換することです:

arr1.sort_by { |hash| hash[:reference].to_s } 

ます。また、デフォルト値を割り当てることができます。

arr1.sort_by { |hash| hash[:reference] || '' } 

編集

arr1.sort_by { |hash| [ hash[:reference] ? 0 : 1, hash[:reference].to_s ] } 
:あなたが最後にソート nil値をしたい場合
+0

はあなたに感謝します。 ':reference'キーのないハッシュが配列の最後に来るように配列をソートする方法はありますか? – danynl

+0

私は、ソートに2番目の要素を追加して強制的に元に戻す方法を追加しました。配列は、最初の要素*、* 2番目の要素に基づいてソートされているので、これを行う便利な方法です。 – tadman

+0

最後の行に '.to_s'は必要ありません。文字列は 'nil'と' nil <=> nil#=> 0'とは決して比較されません。 –

1

一時変数を気にしない場合、配列を2つの配列に分割できます.1つは:referenceとth E他のないもの:

with_ref, without_ref = arr1.partition { |h| h[:reference] } 

そして、最初のものを並べ替える:

with_ref.sort_by! { |h| h[:reference] } 

そして最後に、両方の配列を連結:

arr1 = with_ref + without_ref