我有一个数组数组
arr = [
['category','subcat','detail'],['category1','subcat1','detail1']
]
我想从它{'category'=>'category','subcat'=>'subcat','detail'=>'detail'}...,other hashes from array
hash={}
我在做什么
arr.each{|el|
hash['category'] = el[0];
hash['subcat'] = el[1];
hash['detail'] = h[2];
}
但它只返回最后一个元素
hash=>{category:'category1',subcat:'subcat1',detail:'detail1'}
当我使用现有的哈希键时,它可以很好地工作,但是当我尝试设置新键时 - 它不起作用
如何解决?
答案 0 :(得分:3)
哈希只能有唯一的密钥,不允许重复。插入重复项时,您将覆盖任何以前存在的具有相同名称的键:
默想:
foo = {} # => {}
foo['a'] = 1
foo # => {"a"=>1}
foo
现在是单个键/值对的哈希值。如果我尝试使用相同的密钥添加另一个元素,我只会覆盖以前的值,我不会添加另一个键/值对:
foo['a'] = 2
foo # => {"a"=>2}
这基本上就是你正在做的事情:
arr.each{|el|
hash['category'] = el[0];
hash['subcat'] = el[1];
hash['detail'] = h[2];
}
为了使代码正常工作,您需要为循环中的每次迭代找到不同的密钥名称。
我可以添加不同的键/值:
foo['b'] = 3
foo # => {"a"=>2, "b"=>3}
有关详细信息,请参阅the documentation或任何Ruby哈希教程。
答案 1 :(得分:2)
您可以与Array#transpose组合使用Array#to_h。如果您不关心哈希的键是否是字符串,那么您可以简单地执行:
arr.transpose.to_h # => {"category"=>"category1", "subcat"=>"subcat1", "detail"=>"detail1"}
如果您需要按键作为符号,那么您需要做更多的工作:
arr.transpose.to_h.inject({}){|hash, (k,v)| hash[k.to_sym] = v; hash }