访问和更新哈希值 Ruby
Posted
技术标签:
【中文标题】访问和更新哈希值 Ruby【英文标题】:Access and update value in hash of hashes Ruby 【发布时间】:2017-07-08 01:51:46 【问题描述】:我有这个巨大的嵌套 Ruby 哈希:
hash_filter =
"m-ct-filter-bot"=>
"parameters"=>
"filter_action"=>"keep", "filter_key"=>"classification.identifier",
"filter_regex"=>nil, "filter_value"=>""
,
"group"=>"Expert", "name"=>"Filter", "module"=>"bots.experts.filter.expert",
"description"=>"modified by mf370"
,
"m-vision-filter-bot"=>
"parameters"=>
"filter_action"=>"keep", "filter_key"=>"classification.identifier",
"filter_regex"=>nil, "filter_value"=>""
,
"group"=>"Expert", "name"=>"Filter", "module"=>"bots.experts.filter.expert",
"description"=>"modified by mf370"
,
"m-tele-filter-bot"=>
"parameters"=>
"filter_action"=>"keep", "filter_key"=>"classification.identifier",
"filter_regex"=>nil, "filter_value"=>""
,
"group"=>"Expert", "name"=>"Filter", "module"=>"bots.experts.filter.expert",
"description"=>"modified by mf370"
还有这个数组:
array_id = ["ct","vision","tele"]
我正在尝试使用 array_id
的值更新每个嵌套哈希上的键 "filter_value"
上的值。为了有filter_value => ct
,filter_value => vision
,filter_value => tele
在对应的哈希上。
我有以下代码:
array_id.each do |id|
hash_filter.each_pair do |key, value|
value["parameters"]["filter_value"] = id
end
end
但是,当我运行此代码时,密钥 filter_value
始终使用 array_id
的最后一个值更新,这意味着我所有的哈希值都将具有相同的值 filter_value => tele
。
我没有收到任何错误,只是输出不是我所期望的。 你们能帮帮我吗? :)
谢谢!!
【问题讨论】:
以后,请尽量减少您的示例,以说明您的观点。如果您的示例哈希是filter = ct: a: b: "keep", value: "" , c: "Exp" , vision: a: b: "keep", value: "" , c: "Exp" , tele: a: b: "keep", value: "" , c: "Exp"
,那么这里的问题会更清楚。
【参考方案1】:
这是因为你迭代 array_id
所以你的哈希值总是与这个数组的最后一个元素相同。有很多变体可以解决这个问题。但下一次,你应该更加专心;)
感谢@CarySwoveland:
a_id = array_id.dup
hash_filter.each do |_key, value|
value["parameters"]["filter_value"] = a_id.shift
end
hash_filter
另外,对于 Ruby v2.4.0,您可以使用新方法:#transform_values
hash_filter.transform_values.with_index do |value, ind|
value["parameters"]["filter_value"] = array_id[ind]
end
hash_filter
【讨论】:
非常感谢!! :D 如果你写a_id = array_id.dup; hash_filter.each |_key, value| value["parameters"]["filter_value"] = a_id.shift ; hash_filter
,你就不需要索引。我在末尾添加了hash_filter
,以强调您的代码不会返回更新后的hash_filter
。此外,您的方法 #1 会发生变异 hash_filter
,而 Hash#transform_values 不会发生变异,这可能有点令人困惑。 (Hash#transform_values! 确实会发生变异 hash_filter
)。以上是关于访问和更新哈希值 Ruby的主要内容,如果未能解决你的问题,请参考以下文章