gpt4 book ai didi

arrays - 遍历嵌套哈希以创建数组,同时向其中添加项目

转载 作者:数据小太阳 更新时间:2023-10-29 08:43:27 25 4
gpt4 key购买 nike

我有一个嵌套的散列,我想重新排列键/值对。下面的示例显示了指向语言哈希的样式哈希,然后指向语言类型的哈希。我想将其重新格式化,使其看起来像 new_hash 示例。我理解通过遍历不同级别的哈希并创建这样的哈希来构建它,但是,我担心/困惑的部分是创建 :style 指向的数组然后推送正确的风格。

我假设代码片段会像我预期的那样工作。我的 new_hash 将有一个键 :language 指向另一个散列。这个散列有一个 :style 的键,它指向一个数组,我将在其中存储与每种语言相关的所有样式。 :javascript 哈希在其数组中应该有两种样式,因为它在原始 hash 中存在两次,但是,在运行此代码片段时,数组不会添加这两种样式。似乎在分配哈希的一次迭代中, :javascript 被分配了 :oo 的样式,但在另一次迭代中,它被替换为 :functional我不确定在遍历哈希时初始化数组并向其添加多个项目的语法。

hash = {
:oo => {
:ruby => {:type => "Interpreted"},
:javascript => {:type => "Interpreted"},
},
:functional => {
:scala => {:type => "Compiled"},
:javascript => {:type => "Interpreted"}
}
}

new_hash = {
:ruby => {
:type => "Interpreted", :style => [:oo]
},
:javascript => {
:type => "Interpreted", :style => [:oo, :functional]
},
:scala => {
:type => "Compiled", :style => [:functional]
}
}

hash.each do |style, programming_language|
programming_language.each do |language, type|
type.each do |key, value|
new_hash[language] = {:style => [style]}
end
end
end

最佳答案

您可以使用 Hash#update 的形式(又名合并!)和Hash#merge使用散列来确定要合并的两个散列中存在的键的值。有关详细信息,请参阅文档。

hash.each_with_object({}) do |(style,language_to_type_hash),h|
language_to_type_hash.each do |language,type_hash|
h.update(language=> { type: type_hash[:type], style: [style] }) do |_,o,_|
o.merge(style: [style]) { |_,ostyle_arr,nstyle_arr| ostyle_arr + nstyle_arr }
end
end
end
#=> {:ruby =>{:type=>"Interpreted", :style=>[:oo]},
# :javascript=>{:type=>"Interpreted", :style=>[:oo, :functional]},
# :scala =>{:type=>"Compiled", :style=>[:functional]}}

关于arrays - 遍历嵌套哈希以创建数组,同时向其中添加项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41493536/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com