按键排序哈希,忽略重音

时间:2015-10-12 13:36:38

标签: ruby sorting hash

我有一个哈希:

dict = { 
  "someKey"        => [ ... ],
  "anotherKey"     => [ ... ],
  "yetAnōtherKéy"  => [ ... ]
}

我想通过对原始内容进行排序来获得新的哈希值。排序应该忽略重音(通过用非重音版本替换重音字符来完成),

replacements = [
    ["ā", "a"], ["á", "a"], ["à", "a"], ["ǎ", "a"],
    ["ō", "o"], ["ó", "o"], ["ò", "o"], ["ǒ", "o"],
    ["ī", "i"], ["í", "i"], ["ì", "i"], ["ǐ", "i"],     
    ["ē", "e"], ["é", "e"], ["è", "e"], ["ě", "e"],
    ["ū", "u"], ["ú", "u"], ["ù", "u"], ["ǔ", "u"]
]

但是生成的哈希中的键应该保留原始键。怎么可能?

我试过

dict = Hash[dict.sort_by{|k,v| k}]

这可以并且对哈希进行排序。但是,它不会忽略重音,即以重音字符开头的单词会显示在底部。

另一种尝试是:

replacements.each {|replacement| z.gsub!(replacement[0], replacement[1])}

3 个答案:

答案 0 :(得分:3)

根据Cary Swoveland的评论更正了代码。

replacements = Hash.new{|_, k| k}.merge(replacements.to_h)
dict.sort_by{|k,_| k.gsub(/./, replacements)}.to_h

答案 1 :(得分:1)

使用unidecoder gem

require 'unidecoder'
Hash[dict.sort_by{|k,v| k.to_ascii }]

答案 2 :(得分:0)

通过传入首先执行替换的块gsub(如有必要)来覆盖排序方法,然后进行比较<=>。排序将返回已排序的枚举的原始项。我通过阅读文档ri Hash.sort得出的解决方案。