【问题标题】:ruby - Inserting multiple hashes into an array in rubyruby - 将多个哈希插入到 ruby​​ 中的数组中
【发布时间】:2016-09-29 05:43:16
【问题描述】:

我想将多个散列插入一个数组,这将创建一个散列数组。但是每次我向数组添加一个新的散列时,它都会覆盖以前的散列。知道发生了什么吗?

partArray = [] 
partHash = {}

partHash["name"] = "Item1"
partHash["owner"] = "Item1"

#Insert first hash into array
partArray << partHash
puts partArray 

#new set of key, value pairs
#to be appended to array 
partHash["name"] = "Item2"
partHash["owner"] = "Item2"

#Append second hash into array
partArray << partHash

puts partArray

输出:

{"name"=>"Item1", "owner"=>"Item1"}
new Array is : 
{"name"=>"Item2", "owner"=>"Item2"}
{"name"=>"Item2", "owner"=>"Item2"}

我不确定为什么第一个哈希中的值被覆盖。任何帮助表示赞赏。

【问题讨论】:

  • 也许这会有所启发:p partArray.map(&amp;:object_id)
  • 获取相同的散列object_id,具有不同的值。 {"name"=>"Item1", "owner"=>"Item1"} [70094101888900] 新数组是:{"name"=>"Item2", "owner"=>"Item2"} {"name"= >"Item2", "owner"=>"Item2"} [70094101888900, 70094101888900]

标签: arrays ruby hash


【解决方案1】:

您将相同的哈希值保存在数组的两个不同位置。将 Ruby 视为添加对象引用,而不是每次将对象嵌套在另一个对象中时都复制它。

使用不同的值执行此操作,您可能希望每次都创建一个新值:

part_array = [ ]
part_array << {
  # ... Hash entry
}

您可能希望将同一事物两次放入数组中是有正当理由的,这可能是使用大型数据结构时节省内存的一种方式。

请注意,Ruby 倾向于强烈推荐变量名称,例如 part_array,全部小写。同样,对于散列键,符号通常是首选,因为它们在内部很便宜。

【讨论】:

  • 你的意思是每次我想添加一个新条目时都要重新初始化数组和哈希?
  • 只有哈希值,因为这是您每次插入时都要更改的内容。如果您更改了数组,您将拥有一个仅包含最后一个条目的数组。
  • 对,我做到了,而且效果很好。谢谢
  • 另外,有没有办法删除数组中的重复哈希?
  • array.uniq! 通常是删除重复内容的好方法。
【解决方案2】:

我不确定为什么第一个哈希值被覆盖?

首先我们定义一个空数组和一个空哈希。

partArray = [] 
partHash  = {}

现在我们在哈希中创建两个新的键值对。因为partHash 中目前不存在这些密钥,所以它们是为您创建的。

partHash["name"]  = "Item1"
partHash["owner"] = "Item1"
parthHash #{"name"=>"Item1", "owner"=>"Item1"}

将我们的哈希值插入到我们的数组中:

partArray << partHash
partArray #[{"name"=>"Item1", "owner"=>"Item1"}] 

这是关键步骤。因为键 "name""owner" 已经存在于哈希中,[]= 表示法将简单地重新定义任何现有值,所以。

partHash["name"]  = "Item2"
partHash["owner"] = "Item2"
partHash  # {"name"=>"Item2", "owner"=>"Item2"}
partArray #[{"name"=>"Item2", "owner"=>"Item2"}]

目前partArray 包含一个partsHash 哈希。最后你再次将partHash 附加到partArray 中:

partArray << partHash
partArray #[{"name"=>"Item2", "owner"=>"Item2"}, {"name"=>"Item2", "owner"=>"Item2"}]

【讨论】:

  • 是的,我了解发生了什么,并通过重新初始化哈希以删除旧条目来修复它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-27
  • 2017-07-06
  • 1970-01-01
  • 1970-01-01
  • 2021-03-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多