Skip to content

Instantly share code, notes, and snippets.

@ka8725
Created March 15, 2012 10:06
Show Gist options
  • Save ka8725/2043417 to your computer and use it in GitHub Desktop.
Save ka8725/2043417 to your computer and use it in GitHub Desktop.
Есть такой вот OrderedHash, причем его порядок может изменяться при каждом создании Hash'а:
{"FEDEX_EXPRESS" => {:additional_services_amount=>298, :retail_price=>21.03, :price=>18.05, :total_amount=>2103, :your_cost=>16.824, :you_save=>4.206, :base_amount=>1805},
"PRIORITY_OVERNIGHT"=>{:additional_services_amount=>944, :retail_price=>66.74, :price=>57.3, :total_amount=>6675, :your_cost=>53.392, :you_save=>13.348, :base_amount=>5730},
"FEDEX_2_DAY"=>{:additional_services_amount=>380, :retail_price=>26.85, :price=>23.05, :total_amount=>2685, :your_cost=>21.48, :you_save=>5.37, :base_amount=>2305},
"FEDEX_GROUND"=>{:additional_services_amount=>40, :retail_price=>8.06, :price=>7.66, :total_amount=>806, :your_cost=>7.254, :you_save=>0.806, :base_amount=>766}}
Нужно упорядочить этот OrderedHash в порядке следования ключей. Порядок такой: "PRIORITY_OVERNIGHT", "FEDEX_2_DAY", "FEDEX_EXPRESS", "FEDEX_GROUND"
Т.е. результат должен быть такой:
{PRIORITY_OVERNIGHT" = {...}, "FEDEX_2_DAY" => {...}, "FEDEX_EXPRESS" => {...}, "FEDEX_GROUND" => {...}}
... - это я сократил для наглядности
@ka8725
Copy link
Author

ka8725 commented Mar 15, 2012

@prices = {"FEDEX_EXPRESS" => {:additional_services_amount=>298, :retail_price=>21.03, :price=>18.05, :total_amount=>2103, :your_cost=>16.824, :you_save=>4.206, :base_amount=>1805},
"PRIORITY_OVERNIGHT"=>{:additional_services_amount=>944, :retail_price=>66.74, :price=>57.3, :total_amount=>6675, :your_cost=>53.392, :you_save=>13.348, :base_amount=>5730},
"FEDEX_2_DAY"=>{:additional_services_amount=>380, :retail_price=>26.85, :price=>23.05, :total_amount=>2685, :your_cost=>21.48, :you_save=>5.37, :base_amount=>2305},
"FEDEX_GROUND"=>{:additional_services_amount=>40, :retail_price=>8.06, :price=>7.66, :total_amount=>806, :your_cost=>7.254, :you_save=>0.806, :base_amount=>766}}

FEDEX_SERVICE_NAMES = %w(PRIORITY_OVERNIGHT FEDEX_2_DAY FEDEX_EXPRESS_SAVER FEDEX_GROUND GROUND_HOME_DELIVERY).freeze

@prices = FEDEX_SERVICE_NAMES.inject(ActiveSupport::OrderedHash.new) do |res, service|
    res[service] = @prices[service] if @prices[service]
    res
end

@avsej
Copy link

avsej commented Mar 15, 2012

@prices = ActiveSupport::OrderedHash[[
  ["PRIORITY_OVERNIGHT",  {:additional_services_amount=>944, :retail_price=>66.74, :price=>57.3, :total_amount=>6675, :your_cost=>53.392, :you_save=>13.348, :base_amount=>5730}],
  ["FEDEX_2_DAY",         {:additional_services_amount=>380, :retail_price=>26.85, :price=>23.05, :total_amount=>2685, :your_cost=>21.48, :you_save=>5.37, :base_amount=>2305}],
  ["FEDEX_EXPRESS",       {:additional_services_amount=>298, :retail_price=>21.03, :price=>18.05, :total_amount=>2103, :your_cost=>16.824, :you_save=>4.206, :base_amount=>1805}],
  ["FEDEX_GROUND",        {:additional_services_amount=>40, :retail_price=>8.06, :price=>7.66, :total_amount=>806, :your_cost=>7.254, :you_save=>0.806, :base_amount=>766}]
]]

@avsej
Copy link

avsej commented Mar 15, 2012

@prices = {
  "FEDEX_EXPRESS" => {:additional_services_amount=>298, :retail_price=>21.03, :price=>18.05, :total_amount=>2103, :your_cost=>16.824, :you_save=>4.206, :base_amount=>1805},
  "PRIORITY_OVERNIGHT"=>{:additional_services_amount=>944, :retail_price=>66.74, :price=>57.3, :total_amount=>6675, :your_cost=>53.392, :you_save=>13.348, :base_amount=>5730},
  "FEDEX_2_DAY"=>{:additional_services_amount=>380, :retail_price=>26.85, :price=>23.05, :total_amount=>2685, :your_cost=>21.48, :you_save=>5.37, :base_amount=>2305},
  "FEDEX_GROUND"=>{:additional_services_amount=>40, :retail_price=>8.06, :price=>7.66, :total_amount=>806, :your_cost=>7.254, :you_save=>0.806, :base_amount=>766}
}

FEDEX = %w(PRIORITY_OVERNIGHT FEDEX_2_DAY FEDEX_EXPRESS_SAVER FEDEX_GROUND GROUND_HOME_DELIVERY).freeze

@sorted = ActiveSupport::OrderedHash[
  @prices.sort{|a, b| (FEDEX.index(a) <=> FEDEX.index(b)) || 0}
]

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment