Вот мой пример.
Он использует метод index(hash, fields)
, который принимает хеш и поля, по которым вы хотите проиндексировать.
Он грязный и использует локальную переменную дляувеличьте текущий уровень в индексе.
Могу поспорить, что вы можете сделать его намного приятнее.
def index(hash, fields)
# store the last index of the fields
last_field = fields.length - 1
# our indexed version
indexed = {}
hash.each do |key, value|
# our current point in the indexed hash
point = indexed
fields.each_with_index do |field, i|
key_field = key[field]
if i == last_field
point[key_field] = value
else
# ensure the next point is a hash
point[key_field] ||= {}
# move our point up
point = point[key_field]
end
end
end
# return our indexed hash
indexed
end
Затем вы можете просто позвонить
index(myhash, ["var1", "var2"])
похоже, что вы хотите
index({
{"var1"=>"a", "var2"=>"a"} => 1,
{"var1"=>"a", "var2"=>"b"} => 2,
{"var1"=>"b", "var2"=>"a"} => 3,
{"var1"=>"b", "var2"=>"b"} => 4,
}, ["var1", "var2"])
==
{
"a"=> {
"a"=> 1,
"b"=> 2
},
"b"=> {
"a"=> 3,
"b"=> 4
}
}
Кажется, работает.(видеть это как сущность https://gist.github.com/1126580)