Как заменить хэш-ключ другим ключом

У меня есть условие, когда я получаю хеш

  hash = {"_id"=>"4de7140772f8be03da000018", .....}

и я хочу, чтобы этот хеш был

  hash = {"id"=>"4de7140772f8be03da000018", ......}

P.S: я не знаю, какие ключи в хэше, они случайны, которые поставляются с префиксом "_" для каждого ключа, и я не хочу подчеркивания

Ответ 1

Если все ключи являются строками, и все они имеют префикс подчеркивания, вы можете исправить хэш на месте с помощью этого:

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 }

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

Ответ 2

hash[:new_key] = hash.delete :old_key

Ответ 4

вы можете сделать

hash.inject({}){|option, (k,v) | option["id"] = v if k == "_id"; option}

Это должно работать на ваш случай!

Ответ 5

h.inject({}) { |m, (k,v)| m[k.sub(/^_/,'')] = v; m }

Ответ 6

Если мы хотим переименовать конкретный ключ в хэш, мы можем сделать это следующим образом:
Предположим, что мой хэш my_hash = {'test' => 'ruby hash demo'}
Теперь я хочу заменить 'test' на 'message', затем:
my_hash['message'] = my_hash.delete('test')

Ответ 7

hash.each {|k,v| hash.delete(k) && hash[k[1..-1]]=v if k[0,1] == '_'}