Ruby数组哈希过滤后插入新数组出现重复数据问题求助
解决Ruby数组中哈希重复引用的问题
嘿,我明白你为啥会得到重复的结果啦!问题出在你只创建了一个hash_data哈希对象,并且在整个循环里反复修改它的属性,然后把同一个对象的引用添加到line_item数组中。数组存储的是对象的引用,而不是拷贝,所以最后数组里的所有元素其实都指向同一个哈希——也就是最后一次循环修改后的那个版本。
修复方案1:每次循环创建新的哈希对象
把hash_data = {}移到循环内部,这样每次迭代都会生成一个全新的哈希,就不会出现引用重复的问题了:
a = [ {"name"=>"hello", "age"=>"12", "sex"=> "M", "city"=>"Chennai"}, {"name"=>"name2", "age"=>"26", "sex"=> "M", "city"=>"Banglore"} ] line_item = Array.new a.each do |datas| hash_data = {} # 每次循环新建一个独立的哈希 hash_data[:name] = datas["name"] hash_data[:age] = datas["age"] line_item << hash_data end
修复方案2:用map方法更简洁地实现
Ruby里的map方法天生就是用来把一个数组转换成另一个数组的,写法更简洁优雅,也能避免手动管理对象引用的问题:
a = [ {"name"=>"hello", "age"=>"12", "sex"=> "M", "city"=>"Chennai"}, {"name"=>"name2", "age"=>"26", "sex"=> "M", "city"=>"Banglore"} ] line_item = a.map do |data| { name: data["name"], age: data["age"] } end
验证结果
运行上面任意一段代码,都会得到你期望的结果:
[ {:name=>"hello", :age=>"12"}, {:name=>"name2", :age=>"26"} ]
内容的提问来源于stack exchange,提问作者sakthivel
相关产品推荐
相关产品推荐

