我有一系列哈希:
[{number: 1},{number: 2}, {number: 3}, {number: 4}]
我需要根据自定义顺序对它们进行排序:
[3,4,1,2]
因此,结果应为:
[{number: 3},{number: 4}, {number: 1}, {number: 2}]
我知道sort_by
存在,但我只是用它来升序和降序。
我可能会疯狂而不用担心性能,但有没有一种有效的方法可以通过数组基于自定义顺序来命令这个哈希数组?
答案 0 :(得分:5)
根据人们如何解释问题,可能的解决方案可能是:
input = [{number: 6},{number: 10}, {number: 2}, {number: 8}]
hash = Hash[input.map { |h| [h[:number], h] }]
order = [8,10,6,2]
output = hash.values_at(*order)
# => [{:number=>8}, {:number=>10}, {:number=>6}, {:number=>2}]
答案 1 :(得分:1)
input = [{number: 6},{number: 10}, {number: 2}, {number: 8}]
order = [8,10,6,2]
order.map{|i| input.find{|h| h[:number] == i }}
# => [{:number=>8}, {:number=>10}, {:number=>6}, {:number=>2}]
更新了较短的代码:
input = [{number: 6},{number: 10}, {number: 2}, {number: 8}]
order = [8,10,6,2]
input.group_by{|h| h[:number]}
# => {6=>[{:number=>6}],
# 10=>[{:number=>10}],
# 2=>[{:number=>2}],
# 8=>[{:number=>8}]}
input.group_by{|h| h[:number]}.values_at(*order)
# => [[{:number=>8}], [{:number=>10}], [{:number=>6}], [{:number=>2}]]
答案 2 :(得分:1)
只需对a
h = [{number: 1},{number: 2}, {number: 3}, {number: 4}]
a = [3,4,1,2]
p h.sort_by{|el| a.index(el[:number])}
# => [{:number=>3}, {:number=>4}, {:number=>1}, {:number=>2}]