这是输入哈希:
p Score.periods #{"q1"=>0, "q2"=>1, "q3"=>2, "q4"=>3, "h1"=>4, "h2"=>5}
这是我当前的代码,用于将键与值交换,同时将键转换为符号:
periods = Score.periods.inject({}) do |hsh,(k,v)|
hsh[v] = k.to_sym
hsh
end
结果如下:
p periods #{0=>:q1, 1=>:q2, 2=>:q3, 3=>:q4, 4=>:h1, 5=>:h2}
看起来我的代码很笨重,不应该用 4 行代码来完成我在这里所做的事情。有没有更简洁的方式来写这个?
最佳答案
你可以这样做:
Hash[periods.values.zip(periods.keys.map(&:to_sym))]
或者,如果您使用的是 to_h
的 Ruby 版本可用于数组,你可以这样做:
periods.values.zip(periods.keys.map(&:to_sym)).to_h
上面两个例子所做的是将原始散列的键和值组成数组。请注意,哈希的字符串键通过将 to_sym
作为 Proc
传递给 map
映射到符号:
periods.keys.map(&:to_sym)
# => [:q1, :q2, :q3, :q4, :h1, :h2]
periods.values
# => [0, 1, 2, 3, 4, 5]
然后它将它们压缩成一个 [value, key]
对数组,其中 values
的每个对应元素都与 keys 中的对应键匹配
:
periods.values.zip(periods.keys.map(&:to_sym))
# => [[0, :q1], [1, :q2], [2, :q3], [3, :q4], [4, :h1], [5, :h2]]
然后可以使用 Hash[array]
或 array.to_h
将该数组转换回散列。
关于ruby - 用值交换散列键并将键转换为 Ruby 中的符号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22975729/