2013-12-18 2 views
1

хочу нормализовать Hash «клавиши A S с помощью функции нормализации, так что этот хэшЛучший способ заменить ключи хэша

{"aType" => 1, "b_Type" => 2} 

будут преобразованы в

{:atype => 1, :btype => 2} 

Здесь, нормализации функция удаляет символы подчеркивания с клавиш, удаляет их и делает их символами.

я написал следующее, используя map (предположим, что normalize метод нормализации):

params = params.map {|k,v| {normalize(k) => v}}.inject(:merge) 

Есть ли лучший способ сделать это?

Этот вопрос относится к вопросу "How to replace all hash keys having a '.'?". Я хочу знать оптимальный (менее подробный или более быстрый) способ сделать это.

ответ

3

Вот как я хотел бы сделать это

Hash[h.map {|k,v| [normalize(k), v] }] 
+0

Right, выглядит быстрее (I не нравится 'inject (: merge)' на точке зрения производительности. Позвольте мне ждать других ответов :) – shigeya

1

Вот как Rails делает это (они расширяют Hash, чтобы все ключи строки в этом случае, но вы можете так же легко поместить метод в другом месте).

def stringify_keys! 
    keys.each do |key| 
    self[key.to_s] = delete(key) 
    end 
    self 
end 

Хотя все эти подходы являются разумными, и, по-видимому, для большинства применений не существует существенной удобочитаемости или разницы в производительности.

+0

Это звучит здорово, если я использую то же самое в разных местах, и обезьяна-исправление «Хэш» разумно. Отличный ответ. К сожалению, для моего текущего проекта мне нужно избегать патчей обезьян и необходимости «на месте» или однострочного решения, поэтому я не могу использовать этот способ: <Позвольте мне решить, какой из них лучше ответить позже (независимо от того, Я использую ответ для своего текущего проекта или нет :) – shigeya

+2

Достаточно понятно, как вы могли бы использовать этот метод без переустановки обезьян. Просто заставьте его принять аргумент и использовать его вместо 'self' (и называть' delete' на нем). Но нет, это не однострочный. –

+0

Спасибо. Сам код не является проблемой. Проблема в том, где разместить код исправления обезьяны, особенно мне нужна эта функциональность только в одном месте. – shigeya

0

Если вы находитесь в приложении Rails, или вы хотите, чтобы принести в ActiveSupport, вы можете использовать ActiveSupport::HashWithIndifferentAccess, который позволяет использовать либо 'key' или :key, чтобы установить или получить значение из хэша

+0

Спасибо. Я разрабатываю приложение для рельсов. Но мне нужны ключи одинаковые в разных местах (не только сам хэш), поэтому я не могу использовать эту схему. Спасибо, в любом случае. – shigeya

Смежные вопросы