【问题标题】:How to append values from an hash to another one using Ruby如何使用 Ruby 将值从散列附加到另一个散列
【发布时间】:2017-09-23 23:48:52
【问题描述】:

我有一个哈希:

{:userdata=>["field: email,start: 0,end: 0"]}

我想添加到另一个看起来像这样的哈希:

{:userdata=>["field: resource.attributes.account_source.iban,start: 0,end: 0", "field: resource.attributes.account_source.person_name,start: 0,end: 0", "field: resource.attributes.account_target.iban,start: 0,end: 0", "field: resource.attributes.account_target.person_name,start: 0,end: 0"], :iddata=>["field: resource.attributes.account_source.account_id,start: 0,end: 0", "field: resource.attributes.account_source.person_id,start: 0,end: 0", "field: resource.attributes.account_target.account_id,start: 0,end: 0", "field: resource.attributes.account_target.person_id,start: 0,end: 0"], :infodata=>["field: resource.attributes.reason,start: 0,end: 0"], :balancedata=>["field: resource.attributes.amount,start: 0,end: 0"]}

第二个哈希和值数组中有多个键,所以我需要在正确的位置添加值,应该是这样的:

 {:userdata=>["field: resource.attributes.account_source.iban,start: 0,end: 0", "field: resource.attributes.account_source.person_name,start: 0,end: 0", "field: resource.attributes.account_target.iban,start: 0,end: 0", "field: resource.attributes.account_target.person_name,start: 0,end: 0", "field: email,start: 0,end: 0"], ....

第二个散列更复杂,它可能包含我试图“合并”的散列的相同键,但当然缺少值,这是我想在第二个散列中添加的值。

【问题讨论】:

  • 在 Ruby 中,我们称它们为 Hash。请阅读“How to Ask”和“minimal reproducible example”及其链接页面。我们希望看到您尝试解决此问题。没有它,您似乎希望我们为您编写代码,这不是 SO 的用途。正如所写,您的问题太宽泛了。
  • 我知道它是一个哈希,你是指标题上的错误吗?我可以改变它,我没有写问题是因为我想要代码,我写是因为我不明白如何解决我的问题,这是不同的。
  • 我要感谢你发给我的链接,这很有帮助,因为我验证了我写的信息帮助人们识别问题,因为我解释了使用 2 个哈希映射,你不能合并他们在这种情况下,因为输出仍然是第二个哈希。事实上,我说过当我尝试合并时,它仍然缺少值。它也是可验证,因为我描述了问题,消除了与问题无关的任何问题,事实上,我没有提及我遇到的其他问题在数组中创建正确的字符串。
  • 虽然你试图证明你为什么要以你的方式写这个问题,但它仍然没有写成它应该是这样的。 “minimal reproducible example”反复说需要代码来证明您遇到的问题。 “How much research effort is expected of Stack Overflow users?”有助于从社区其他人的角度解释它。另见“Writing the perfect question”和“How To s The Smart Way”。

标签: arrays ruby hashmap


【解决方案1】:

您可以将Hash#merge 与块一起使用,并使用Array#| 获得两个数组的并集:

h1 = { userdata: ['field: email,start: 0,end: 0'] }
h2 = { userdata: ['field: resource.attributes.account_source.iban,start: 0,end: 0', 'field: resource.attributes.account_source.person_name,start: 0,end: 0', 'field: resource.attributes.account_target.iban,start: 0,end: 0', 'field: resource.attributes.account_target.person_name,start: 0,end: 0'], iddata: ['field: resource.attributes.account_source.account_id,start: 0,end: 0', 'field: resource.attributes.account_source.person_id,start: 0,end: 0', 'field: resource.attributes.account_target.account_id,start: 0,end: 0', 'field: resource.attributes.account_target.person_id,start: 0,end: 0'], infodata: ['field: resource.attributes.reason,start: 0,end: 0'], balancedata: ['field: resource.attributes.amount,start: 0,end: 0'] }

h3 = h1.merge(h2) { |_, old_array, new_array| new_array | old_array | }
# {:userdata=>["field: resource.attributes.account_source.iban,start: 0,end: 0", "field: resource.attributes.account_source.person_name,start: 0,end: 0", "field: resource.attributes.account_target.iban,start: 0,end: 0", "field: resource.attributes.account_target.person_name,start: 0,end: 0", "field: email,start: 0,end: 0"], :iddata=>["field: resource.attributes.account_source.account_id,start: 0,end: 0", "field: resource.attributes.account_source.person_id,start: 0,end: 0", "field: resource.attributes.account_target.account_id,start: 0,end: 0", "field: resource.attributes.account_target.person_id,start: 0,end: 0"], :infodata=>["field: resource.attributes.reason,start: 0,end: 0"], :balancedata=>["field: resource.attributes.amount,start: 0,end: 0"]}

请注意,:userdata'userdata' 不是相同的 Ruby 对象,并且在哈希中不被视为相同的键。

最后,散列中的值不是散列,而是字符串数组。具有相同字段但值不同的两个字符串将被视为完全不同:

['field: a'] | ['field: a, value: 1']
# ["field: a", "field: a, value: 1"]

如果您想要哈希的功能,请使用Hash

【讨论】:

  • 非常感谢!所以它基本上是连接两个数组的数组方法......哇!
猜你喜欢
  • 1970-01-01
  • 2013-11-14
  • 2023-03-07
  • 2016-09-04
  • 1970-01-01
  • 2016-11-04
  • 1970-01-01
  • 2014-06-16
  • 2011-02-03
相关资源
最近更新 更多