ruby - 下一个键/值对在尝试使用新键添加对时覆盖散列中的现有对
问题描述
我有:
fruits = {
"orange" => {:season => "winter"},
"apple" => {:season => "winter"},
"banana" => {:season => "summer"},
"grape" => {:season => "spring"},
"peach" => {:season => "winter"},
"pineapple" => {:season => "summer"}
}
我想得到:
{
"winter"=>["orange", "apple", "peach"],
"summer"=>["banana", "pineapple"],
"spring"=>["grape"]
}
我做了:
def sort_fruits(fruits_hash)
fruits=[]
sorted = {}
seasons = fruits_hash.map {|k, v|v[:season]}
seasons.uniq.each do |season|
fruits.clear
fruits_hash.each do |fruit, season_name|
if season == season_name[:season]
fruits << fruit
end
end
p sorted[season] = fruits ## season changes to new season, so this should have created new key/value pair for new season.
end
sorted
end
我得到:
{
"winter"=>["grape"],
"summer"=>["grape"],
"spring"=>["grape"]
}
我无法弄清楚为什么添加具有唯一键的新键/值对会覆盖哈希中的现有对。任何有关解释的帮助将不胜感激。
解决方案
您的问题是您fruits
对所有值重复使用相同的数组。即使你清除它,它仍然是同一个数组。如果不是fruits.clear
您使用fruits = []
,那么您将不会遇到问题。
您可以在以下示例中看到问题:
arr = ['val']
hash = {
key1: arr,
key2: arr
}
p hash # => { key1: ['val'], key2: ['val'] }
arr.clear
p hash # => { key1: [], key2: [] }
您也可以使用sorted[season] = fruits.clone
or sorted[season] = [*fruits]
... 任何使用新数组的东西。
您必须跟踪何时使用“变异”方法(那些就地更改对象的方法,例如clear
) - 这是使用散列和数组时的常见陷阱
推荐阅读
- php - Laravel 更新带有 foreach 循环的单行
- import - Jest 编译代码的方式与 ts-node 不同
- flutter - 在 Flutter 中加载图像并处理加载异常的正确方法是什么
- webpack - 为什么 Webpack 5 会返回一个非零错误代码作为性能提示?
- clojurescript - ClojureScript:TypeError:$jscomp.inherits 不是函数
- mpi - MPI - 单方面的沟通
- vue.js - 从父组件中的发出事件中检索 $event 对象
- go - 我需要释放指针吗
- asp.net-core - 代码覆盖率选项卡未在 Azure DevOps 中显示报告
- php - PHP如何更新数据库表中不同列中上传的多个文件