ruby-on-rails rails hash - 如何用另一個鍵替換散列鍵




4 Answers

如果所有的鍵都是字符串,並且它們都有下劃線前綴,那麼你可以用下面的代碼修改散列:

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 }

如果您不喜歡k[]表示法來提取子字符串,您也可以使用sub

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 }

對於沒有下劃線前綴而沒有額外修改的密鑰應該沒問題。

format symbol

我有一個條件,我得到一個散列

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

我想要這個散列

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

PS :我不知道哈希中的密鑰是什麼,它們是隨機的,每個密鑰都帶有一個“_”前綴,我不想下劃線







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



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



Related