【问题标题】:Add key to nested hash while iterating over a hash在迭代哈希时将键添加到嵌套哈希
【发布时间】:2015-01-06 21:06:27
【问题描述】:

假设我有一个像这样的哈希:

myhash = {'key1': {'innerkey1': 'innervalue1', ...}, ...}

我想遍历这个散列并将一个键值对添加到内部散列。上面的例子变成:

myhash = {'key1': {'innerkey1': 'innervalue1', 'addedkey': 'addedvalue', ...}, ...}

我尝试使用myhash.each do |k, v|,但更改块中的v 只会影响块范围内的哈希。它通过在块内执行myhash[k]['addedkey'] = 'addedvalue' 来工作,但我想修改内部哈希,而不是使用myhash 来执行此操作。

如何在 Ruby 中做到这一点?

【问题讨论】:

  • addedkey 嵌套在 myhash 中,你必须从上层开始。
  • 对不起,我不太明白你的意思。
  • 您试图访问内部哈希对象而不通过外部哈希对象,对吧?
  • 不,我正在对 myhash 做一个 each,并且在那个块中我试图添加到当前值。
  • 我真的不确定我是否关注这里。这是你在做什么? gist.github.com/allcentury/7d91592e75ffabbe71a2

标签: ruby hash


【解决方案1】:

使用Hash merge!方法:

myhash = { k1: { innerk1: 'innerv1' },  k2: { innerk2: 'innerv2' } }

myhash.each do |key, value|
  value.merge!({ addedk: 'addedv' })
end

p myhash

# {:k1=>{:innerk1=>"innerv1", :addedk=>"addedv"}, :k2=>{:innerk2=>"innerv2", :addedk=>"addedv"}}

【讨论】:

  • 谢谢,这正是我想要的!
  • 这比仅仅做分配慢3倍,即value['addkey'] = 'newvalue'
  • 但是为什么我的更改值在退出我进行更改的块时没有反映出来?
  • @AndreiHorak 你的“改变没有反映出来”是什么意思?你确定你使用的是#merge的bang(!)版本。如果你使用 #merge 什么都不会改变,但是使用 #merge! 会改变对象。但正如 Anthony 所说,分配更快,也会反映出变化
  • 我在回复 Anthony 的评论。如果分配在块中有效,那么它一定是我在某个地方的错误。安东尼,然后你可以提交你的答案:)
猜你喜欢
  • 2023-03-18
  • 2018-04-21
  • 2020-08-18
  • 1970-01-01
  • 2013-04-30
  • 1970-01-01
  • 2013-12-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多