Как отсортировать хэш ruby ​​со строковым ключом, установив приоритет для ключевых элементов? - PullRequest
0 голосов
/ 05 декабря 2018

У меня есть хеш со следующими значениями:

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

Какой самый простой способ сделать что-то вроде этого:

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

И вернуть:

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

Ответы [ 4 ]

0 голосов
/ 07 декабря 2018

Подписка тоже будет работать,

priority = %i(:green yellow red)

priority.inject({}) { |m, v| m[v] = hash[v]; m }
0 голосов
/ 05 декабря 2018

Если в хеше есть ключи, не включенные в массив приоритетов:

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

0 голосов
/ 05 декабря 2018
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=>""}}
0 голосов
/ 05 декабря 2018

Если ваш приоритетный массив содержит все хеш-ключи, вам не нужно сортировать.Вы можете просто разобрать хеш и создать новый.

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

priority = %i[green yellow red]

hash.slice(*priority)
# => {:green=>{:something=>""}, :yellow=>{:something=>""}, :red=>{:something=>""}}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...