访问和更新哈希值 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 => ctfilter_value => visionfilter_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的主要内容,如果未能解决你的问题,请参考以下文章

Ruby .store 函数将哈希值从数组更改为单个值

在更改 ruby​​ 中的某些值后,如何维护具有原始值的哈希副本?

ruby 符号作为键,但无法从哈希中获取值

ruby 哈希,其中键来自数组,值作为默认值

ruby 合并哈希中的哈希值

是否有更惯用的方法来更新 ActiveRecord 属性哈希值?