Hash - вложенный обход - Ruby - (любой знает это) - PullRequest
0 голосов
/ 28 июля 2011

У меня есть этот хэш

hasha = {"a" => "b","a_a" => {"x_y" => "sreeraj","a_b" => "hereIam"}}

Мне нужно изменить это на

hasha = {"a" => "b","a-a" => {"x-y" => "sreeraj","a-b" => "hereIam"}}

т.е. Мне нужно изменить все ключи, содержащие "_" (подчеркивание) на "-" (минус). Как я могу это сделать?

Ответы [ 2 ]

6 голосов
/ 28 июля 2011

Возможно, это не самый умный, но он работает:

def rep_key(hash={})  
    newhash={}
    hash.each_pair do |key,val|
        val = rep_key(val) if val.class == Hash
        newhash[key.sub(/_/,'-')] = val
    end
    newhash
end

, где:

hasha = {"a" => "b","a_a" => {"x_y" => "sreeraj","a_b" => "hereIam"}}
newhash = rep_key hasha
puts newhash.inspect

дает:

newhash = {"a" => "b","a-a" => {"x-y" => "sreeraj","a-b" => "hereIam"}}
3 голосов
/ 28 июля 2011

Попробуйте рекурсию.

def replace_all(x, a, b)
    return if x.class != Hash
    y = Hash.new
    x.each do |k,v|
        if(v.class == Hash)
            v = replace_all(v, a, b)
        end

        if k.class == String and k.include?(a)
            y[k.gsub(a,b)] = v
        else
            y[k] = v
        end
    end
    return y
end

hasha = {"a" => "b","a_a" => {"x_y" => "sreeraj","a_b" => "hereIam"}}

puts replace_all(hasha, "_", "-")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...