у меня есть такие хэш-таблицы:Как преобразовать хеш-таблицы во встроенные (вложенные) хэш-таблицы с Ruby?
h={"c4"=>1, "c8"=>2, "ec"=>3, "a"=>4, "e4"=>5, "1"=>6, "8"=>7}
я могу получить доступ значение 2, как: h["c8"]
Я хотел бы преобразовать хэш-таблицу с вложенной хэш-таблицу, как это:
h={"c"=>{"4"=>1, "8"=>2}, "e"=>{"c"=>3, "4"=>5}, "a"=>4, "1"=>6, "8"=>7}
Таким образом, я мог получить доступ к значению 2 как: h["c"]["8"]
и всем остальным значениям аналогичным образом.
В целом вместо:
h["c8"]
Я предпочел бы использовать:
h["c"]["8"]
Потому что я хотел бы отметить строки в JavaScript. Поэтому я хотел бы создать очень большую встроенную хеш-таблицу с Ruby, выгрузить ее в JSON и загрузить в javascript. Такие встроенные хэш-таблицы легче искать, чем оригинальные. Ключи приходят из MD5, хешируя некоторые исходные значения, которые были именами файлов, а затем находили минимальные фрагменты с начала хэшированных ключей MD5, которые все еще uniq.
Еще больше пример:
h={"c4"=>1,
"c8"=>2,
"ec"=>3,
"a8"=>4,
"e4"=>5,
"1"=>6,
"8"=>7,
"c9"=>8,
"4"=>9,
"d"=>10,
"6"=>11,
"c2"=>12,
"c5"=>13,
"aa"=>14}
Было бы:
h={"c"=>{"4"=>1, "8"=>2, "9"=>8, "2"=>12, "5"=>13},
"e"=>{"c"=>3, "4"=>5},
"a"=>{"8"=>4, "a"=>14},
"1"=>6,
"8"=>7,
"4"=>9,
"d"=>10,
"6"=>11}
Еще больше пример:
h={"c4"=>1, "c8"=>2, "ec"=>3, "a8"=>4, "e4"=>5, "16"=>6, "8f"=>7, "c9"=>8, "45"=>9, "d3"=>10, "65"=>11, "c2"=>12, "c5"=>13, "aa"=>14, "9b"=>15, "c7"=>16, "7"=>17, "6f"=>18, "1f0"=>19, "98"=>20, "3c"=>21, "b"=>22, "37"=>23, "1ff"=>24, "8e"=>25, "4e"=>26, "0"=>27, "33"=>28, "6e"=>29, "3417"=>30, "c1"=>31, "63"=>32, "18"=>33, "e3"=>34, "1c"=>35, "19"=>36, "a5b"=>37, "a57"=>38, "d67"=>39, "d64"=>40, "3416"=>41, "a1"=>42}
быть бы:
h={"c"=>{"4"=>1, "8"=>2, "9"=>8, "2"=>12, "5"=>13, "7"=>16, "1"=>31},
"e"=>{"c"=>3, "4"=>5, "3"=>34},
"a"=>{"8"=>4, "a"=>14, "5"=>{"b"=>37, "7"=>38}, "1"=>42},
"1"=>{"6"=>6, "f"=>{"0"=>19, "f"=>24}, "8"=>33, "c"=>35, "9"=>36},
"8"=>{"f"=>7, "e"=>25},
"4"=>{"5"=>9, "e"=>26},
"d"=>{"3"=>10, "6"=>{"7"=>39, "4"=>40}},
"6"=>{"5"=>11, "f"=>18, "e"=>29, "3"=>32},
"9"=>{"b"=>15, "8"=>20},
"7"=>17,
"3"=>{"c"=>21, "7"=>23, "3"=>28, "4"=>{"1"=>{"7"=>30, "6"=>41}}},
"b"=>22,
"0"=>27}
Моя попытка решить эту проблему немного некрасиво и использует «Eval», «ч» оригинальный хэш:
nested_hash={}
h.keys.each{|k|
k.split(//).each_with_index{|b,i|
if nested_hash.dig(*k[0..i].split(//))==nil then
eval("nested_hash"+k[0..i].split(//).map{|z| "[\"#{z}\"]"}.join+"={}")
end
if i==k.size-1 then
eval("nested_hash"+k[0..i].split(//).map{|z| "[\"#{z}\"]"}.join+"=h[k]")
end
};
};
Пожалуйста, прочитайте "[просить]" и «[mcve ]». Мы хотели бы видеть вашу попытку решения проблемы. Без этого похоже, что вы дали нам требования и ожидаете, что мы напишем код для вас. –
Что было бы желаемым результатом, если 'h = {" a "=> 1," aa "=> 2}'? Возможно, '{" a "=> {" "=> 1," a "=> 2}'? –
Эти комбинации клавиш в моем случае не допускаются, потому что процесс минимализации, который я применяю к преобразованным ключам MD5, не выделяет ключи, которые являются префиксом других ключей. Но в общем случае: да. – Konstantin