使用来自另一个哈希的新值更新了 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 将哈希值转换为排序的字符串数组,以便与另一个哈希值进行比较

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

从数组 ruby​​ 生成哈希键和值

如何将 yaml 文件解析为 ruby​​ 哈希和/或数组?

浏览哈希数组以删除Ruby中其他字符串中包含的字符串

如何检查我的哈希是否有来自字符串数组的键?