使用来自另一个哈希的新值更新了 Ruby 哈希数组
Posted
技术标签:
【中文标题】使用来自另一个哈希的新值更新了 Ruby 哈希数组【英文标题】:Updated Ruby array of hash with new values from another hash 【发布时间】:2022-01-12 03:35:33 【问题描述】:john = "111":"placeId":"333" , "22":"placeId":"22"
adam = ["id": "333","doc": "30","id": "22","doc": "31"]
sams_collection = ["some_id": "30", "some_id": "31"]
adam.each do | adam_data |
john.each_key do | john_data_key |
if (adam_data['id'] == john['john_data_key']['placeId'])
john['john_data_key']['org'][adam_data['id']] = sams_collection
end
end
end
我目前遇到了一个错误:
undefined method `[]' for nil:NilClass (NoMethodError))
我期待john
更新如下。
john = "111":"placeId":"333", "org" : "333" : ["30", "31"] , "22":"placeId":"22"
【问题讨论】:
【参考方案1】:这里有几个问题。
首先,因为您使用 JSON 格式来定义哈希:
a: b, c: d
相对于 hashrocket 风格(带 =>):
a => b, c => d
您正在使用 符号 表示 'a' 和 'c' 而不是字符串。具体来说,你需要查找并理解在ruby中,:a
是一个符号,"a"
是一个字符串。
如果您执行以下操作,您可以看到:
puts adam.inspect
# returns [:id=>"333", :doc=>"30", :id=>"22", :doc=>"31"]
如果您想使用字符串,则需要改用"key" => val
格式。
它变得更加混乱,因为您将数字用作字符串,这会产生一股代码味道 - 您真的想将这些数字存储/引用为字符串吗?
但更令人困惑的是,您将键作为数字......除了它们是字符串......除了它们实际上是符号。
看看约翰:
john = "111":"placeId":"333" , "22":"placeId":"22"
看起来您正在使用键 111
引用第一个哈希,但它似乎在字符串中,除了由于 a: b
它正在成为数字字符串的符号,看起来像:
:"111"
所以这是一个令人困惑的世界。
但除此之外,您还有:
john['john_data_key']
这意味着您想使用键 "john_data_key"
访问 john 哈希 - 而不是变量 john_data_key
中的值。后者是:
john[john_data_key]
所以你这里有很多问题。
我建议您使用调试器查看此内容,或者至少做一些puts my_variable.inspect
,以便您可以看到您正在创建的这些数据结构中的实际内容。
然后重新考虑如何构建数据以及如何访问它,然后这个问题将变得更容易管理。
【讨论】:
很好的答案。写哈希字面量的两种方式通常称为 hashrocket (=>) 和 JSON 样式。 是的,我正在努力记住第二种样式的名称,我会更新答案。【参考方案2】:john = "111":"placeId":"333" , "22":"placeId":"22"
adam = ["id": "333","doc": "30","id": "22","doc": "31"]
sams_collection = ["some_id": "30", "some_id": "31"]
adam.each do | adam_data |
john.each_key do | john_data_key |
if (adam_data[:id] == john[john_data_key][:placeId])
some = adam_data[:doc] => sams_collection
john[john_data_key][:org] = some
end
end
end
p john.to_s
感谢您的建议 --> 这是具有相同数据的工作代码:|
":\"111\"=>:placeId=>\"333\", :org=>\"30\"=>[:some_id=>\"30\", :some_id=>\"31\"], :\"22\"=>:placeId=>\"22\", :org=>\"31\"=>[:some_id=>\"30\", :some_id=>\"31\"]"
【讨论】:
我认为这个解决方案仍然存在问题。您在符号周围使用引号,这混淆了它们的实际含义。请在 ruby 中查找符号与字符串(知道区别非常有用,符号在索引名称不变的事物方面可能比字符串更有效)。 (你会注意到你需要在你拥有的数字符号周围加上引号 - 但这部分是因为数字符号很少是一个好主意,并且可能会误解如何符号有效。)所以我会重新考虑你的解决方案。您可能希望在符号有意义的地方使用符号,在数字有意义的地方使用数字。例如,使用实际数字而不是符号来创建 john 哈希索引。并让 id 成为一个符号,它指向数字 333 或 22 或其他数字,而不是字符串 333/22/... 感谢您的帮助,我明白您要解释的内容以上是关于使用来自另一个哈希的新值更新了 Ruby 哈希数组的主要内容,如果未能解决你的问题,请参考以下文章
ruby 将哈希值转换为排序的字符串数组,以便与另一个哈希值进行比较