简体   繁体   English

如何通过设置键元素的优先级来使用字符串键对红宝石哈希排序?

[英]How can I sort ruby hash with string key by setting priority to the key elements?

I have a hash with the following values: 我有一个具有以下值的哈希值:

hash = {
  'red': { something: ''},
  'green': { something: '' },
  'yellow': { something: ''}
}

What is the simplest way to do something like this: 做这样的最简单的方法是什么:

hash.sort_by_key_with_priority(['green', 'yellow', 'red'])

And return: 并返回:

hash = {
  'green': { something: '' },
  'yellow': { something: ''},
  'red': { something: ''},
}

If your priority array contains all of the hash keys, you don't need sorting. 如果优先级数组包含所有哈希键,则不需要排序。 You can simply take the hash apart and construct a new one. 您可以简单地将散列拆开并构造一个新的散列。

hash = {
  red: { something: ''},
  green: { something: '' },
  yellow: { something: ''}
}

priority = %i[green yellow red]

hash.slice(*priority)
# => {:green=>{:something=>""}, :yellow=>{:something=>""}, :red=>{:something=>""}}

If there are keys in the hash not included in priority array: 如果哈希中的某些键未包含在优先级数组中:

>> 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"]]

Use to_h method on result to convert to hash 在结果上使用to_h方法转换为hash

hash = {
    'red': { something: ''},
    'green': { something: '' },
    'yellow': { something: ''}
}

Code

p ['green', 'yellow', 'red'].map{|value|[value.to_sym,hash[value.to_sym]]}.to_h

output 输出

{:green=>{:something=>""}, :yellow=>{:something=>""}, :red=>{:something=>""}}

Following will also work, 以下也可以,

priority = %i(:green yellow red)

priority.inject({}) { |m, v| m[v] = hash[v]; m }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM