Ruby数组转哈希报错原因咨询及批量转换需求
理解Ruby数组转哈希的报错原因,以及实现你的需求
为什么[:a, [1,2,3]].to_h会报错?
Ruby的Array#to_h方法有明确规则:它要求数组中的每个元素都是包含两个元素的子数组(键值对),比如[[:a, 1], [:b, 2]].to_h会正常返回{:a=>1, :b=>2}。
而你的数组[:a, [1,2,3]]里的元素是:a(单个符号)和[1,2,3](长度为3的数组),这两个元素都不是“键值对子数组”。当to_h尝试处理第一个元素:a时,发现它不符合要求,所以抛出TypeError: wrong element type Symbol at 0 (expected array)。
为什么Hash[ [:a, [1,2,3]] ]会报错?
Hash.[]方法的行为分两种情况:
- 若传入多个参数(比如
Hash[:a, 1, :b, 2]),它会把参数按键、值、键、值的顺序两两配对成哈希。 - 若传入一个数组参数(比如
Hash[[[:a,1], [:b,2]]]),它要求这个数组的每个元素都是包含两个元素的键值对子数组。
你传入的[:a, [1,2,3]]是一个数组参数,Hash.[]会遍历这个数组的每个元素,检查是否符合键值对要求(长度为2的数组)。但:a是符号不是数组,[1,2,3]是长度为3的数组,都不满足,所以抛出ArgumentError: invalid number of elements (3 for 1..2)。
如何把[:a, [1,2,3]]正确转成哈希?
如果你想要得到{:a => [1,2,3]},有几种简单可行的方式:
- 把数组拆成交替的键值参数传入
Hash.[]:Hash[*[:a, [1,2,3]]] # 返回 {:a=>[1,2,3]} - 把原数组包装成包含单个键值对子数组的数组,再用
to_h:[[ :a, [1,2,3] ]].to_h - 直接构建哈希(最直观):
{ :a => [1,2,3] }
如何把[ [:a, [1,2,3]], [:b, [4,5,6]] ]转成哈希数组?
你的需求是把每个键值对转换成单独的哈希,最终得到[{:a=>[1,2,3]}, {:b=>[4,5,6]}],可以用Array#map遍历每个元素,单独构建哈希:
original_array = [ [:a, [1,2,3]], [:b, [4,5,6]] ] hashes_array = original_array.map { |key, value| { key => value } } # 返回 [{:a=>[1,2,3]}, {:b=>[4,5,6]}]
如果你其实是想把整个数组转成一个大哈希({:a=>[1,2,3], :b=>[4,5,6]}),那直接用to_h就可以:
original_array.to_h # 返回 {:a=>[1,2,3], :b=>[4,5,6]}
内容的提问来源于stack exchange,提问作者Daniel Viglione
相关产品推荐
相关产品推荐

