2016-08-05 21 views
0

私は注文の詳細のハッシュを持っており、詳細は配列にあります。それから私はユニークなユーザ名をリストにまとめたいと思っています。これに対して、注文日時に基づいて配列を並べ替える(最後の注文が最初になる)、注文日時が利用できない場合は、注文IDに基づいて並べ替える必要があります。したがって、リスト内の名前は、注文日時を持ち、注文日時のない名前をリストの最後に置きます。私のハッシュです下:複雑なソートとデータ収集

{ 
    "orderDetails": [ 
     { 
      "orderId": 11, 
      "orderDtTm": "2016-08-04T19:39:06.000Z", 
      "orderTz": "America/Chicago", 
      "user": { 
       "userId": 1, 
       "userName": "Joe, SMITH" 
      } 
     }, 
     { 
      "orderId": 10, 
      "user": { 
       "userId": 2, 
       "userName": "Lynn, WILSON" 
      } 
     }, 
     { 
      "orderId": 25, 
      "orderDtTm": "2016-08-04T20:39:06.000Z", 
      "orderTz": "America/Chicago", 
      "user": { 
       "userId": 1, 
       "userName": "Joe, SMITH" 
      } 
     }, 
     { 
      "orderId": 33, 
      "user": { 
       "userId": 3, 
       "userName": "Mark, Taylor" 
      } 
     }, 
     { 
      "orderId": 16, 
      "orderDtTm": "2016-08-04T21:53:09.000Z", 
      "orderTz": "America/Chicago", 
      "user": { 
       "userId": 3, 
       "userName": "Mark, Taylor" 
      } 
     } 
    ] 
} 

注文1、3、5は注文日の時間を持っているので、私の最初のリストは["Mark, Taylor", "Joe, SMITH", "Joe, SMITH"]すなわち順5、3と1になり置かラストオーダーに基づいてソートし、追加されるだろう他の名前は注文IDに基づいています。注文日時が4桁と2桁になるからです。最後の配列は["Mark, Taylor", "Joe, SMITH", "Joe, SMITH", "Mark, Taylor", "Lynn, WILSON"]になります。

私はどうなるユニークユーザー名たいので:["Mark, Taylor", "Joe, SMITH", "Lynn, WILSON"]

私のコードを取得することに

["Mark, Taylor", "Joe, SMITH", "Joe, SMITH", "Mark, Taylor", "Lynn, WILSON"].uniqを:

order_details = order_details_data[:orderDetails] 

order_details_array = order_details.sort_by { |key| key[:orderDtTm]|| key[:orderId] }.reverse 
user_names_set = Set.new 

order_details_array.each do |obj| 
    user_name = obj[:user][:userName] 
    user_names_set << user_name unless user_name.blank? 
end 

私はいつも注文日の時間を持っている場合、これは正常に動作し、私はいくつかの詳細のための注文日時がないときに予期せぬ出力を与える。

答えて

0

sort_byの代わりにカスタムコンパレータを使用してください。

order_details_array = order_details.sort do |a,b| 
    if a[:orderDtTm] && b[:orderDtTm] 
    b[:orderDtTm] <=> a[:orderDtTm] 
    elsif a[:orderDtTm] && !b[:orderDtTm] 
    -1 
    elsif !a[:orderDtTm] && b[:orderDtTm] 
    1 
    else 
    b[:orderId] <=> a[:orderId] 
    end 
end 

代わりの

order_details_array = order_details.sort_by { |key| key[:orderDtTm]|| key[:orderId] }.reverse 
ような何か
関連する問題