[英]How can I sort ruby hash with string key by setting priority to the key elements?
我有一個具有以下值的哈希值:
hash = {
'red': { something: ''},
'green': { something: '' },
'yellow': { something: ''}
}
做這樣的最簡單的方法是什么:
hash.sort_by_key_with_priority(['green', 'yellow', 'red'])
並返回:
hash = {
'green': { something: '' },
'yellow': { something: ''},
'red': { something: ''},
}
如果優先級數組包含所有哈希鍵,則不需要排序。 您可以簡單地將散列拆開並構造一個新的散列。
hash = {
red: { something: ''},
green: { something: '' },
yellow: { something: ''}
}
priority = %i[green yellow red]
hash.slice(*priority)
# => {:green=>{:something=>""}, :yellow=>{:something=>""}, :red=>{:something=>""}}
如果哈希中的某些鍵未包含在優先級數組中:
>> h = {red: 512, green: 63, yellow: 99, foo: 42, baz: 'hi'}
=> {:red=>512, :green=>63, :yellow=>99, :foo=>42, :baz=>"hi"}
>> p = %i[green yellow red]
=> [:green, :yellow, :red]
# this puts keys not in array at start
# h.sort_by { |k, v| p.include?(k) ? p.index(k) : -1 }
>> h.sort_by { |k, v| p.index(k) || -1 }
=> [[:foo, 42], [:baz, "hi"], [:green, 63], [:yellow, 99], [:red, 512]]
# this puts keys not in array at end
# h.sort_by { |k, v| p.include?(k) ? p.index(k) : p.size }
>> h.sort_by { |k, v| p.index(k) || p.size }
=> [[:green, 63], [:yellow, 99], [:red, 512], [:foo, 42], [:baz, "hi"]]
在結果上使用to_h
方法轉換為hash
hash = {
'red': { something: ''},
'green': { something: '' },
'yellow': { something: ''}
}
碼
p ['green', 'yellow', 'red'].map{|value|[value.to_sym,hash[value.to_sym]]}.to_h
輸出
{:green=>{:something=>""}, :yellow=>{:something=>""}, :red=>{:something=>""}}
以下也可以,
priority = %i(:green yellow red)
priority.inject({}) { |m, v| m[v] = hash[v]; m }
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.