У меня есть условие, когда я получаю хеш
hash = {"_id"=>"4de7140772f8be03da000018", .....}
и я хочу, чтобы этот хеш был
hash = {"id"=>"4de7140772f8be03da000018", ......}
P.S: я не знаю, какие ключи в хэше, они случайны, которые поставляются с префиксом "_" для каждого ключа, и я не хочу подчеркивания
Если все ключи являются строками, и все они имеют префикс подчеркивания, вы можете исправить хэш на месте с помощью этого:
h.keys.each { |k| h[k[1, k.length - 1]] = h[k]; h.delete(k) }
k[1, k.length - 1]
бит захватывает все k
, кроме первого символа. Если вы хотите получить копию, то:
new_h = Hash[h.map { |k, v| [k[1, k.length - 1], v] }]
или
new_h = h.inject({ }) { |x, (k,v)| x[k[1, k.length - 1]] = v; x }
Вы также можете использовать sub
, если вам не нравится нотация k[]
для извлечения подстроки:
h.keys.each { |k| h[k.sub(/\A_/, '')] = h[k]; h.delete(k) }
Hash[h.map { |k, v| [k.sub(/\A_/, ''), v] }]
h.inject({ }) { |x, (k,v)| x[k.sub(/\A_/, '')] = v; x }
И если только некоторые из клавиш имеют префикс подчеркивания:
h.keys.each do |k|
if(k[0,1] == '_')
h[k[1, k.length - 1]] = h[k]
h.delete(k)
end
end
Аналогичные модификации могут быть сделаны ко всем другим вариантам выше, но эти два:
Hash[h.map { |k, v| [k.sub(/\A_/, ''), v] }]
h.inject({ }) { |x, (k,v)| x[k.sub(/\A_/, '')] = v; x }
должно быть хорошо с ключами, у которых нет префиксов подчеркивания без дополнительных изменений.
hash[:new_key] = hash.delete :old_key
rails У хэша есть стандартный метод для него:
hash.transform_keys{ |key| key.to_s.upcase }
http://api.rubyonrails.org/classes/Hash.html#method-i-transform_keys
вы можете сделать
hash.inject({}){|option, (k,v) | option["id"] = v if k == "_id"; option}
Это должно работать на ваш случай!
h.inject({}) { |m, (k,v)| m[k.sub(/^_/,'')] = v; m }
Если мы хотим переименовать конкретный ключ в хэш, мы можем сделать это следующим образом:
Предположим, что мой хэш my_hash = {'test' => 'ruby hash demo'}
Теперь я хочу заменить 'test' на 'message', затем: my_hash['message'] = my_hash.delete('test')
hash[:new_key] = has[:old_key]
, вместо этого это: hash[:dynamic_key] = hash[:_dynamic_key]
, это был ясный вопрос о регулярном выражении, а не простая замена хеша.
hash.each {|k,v| hash.delete(k) && hash[k[1..-1]]=v if k[0,1] == '_'}