我有一个数组,我想将其转换为由项目键入的哈希映射,并将索引数组作为值。例如
arr = ["a", "b", "c", "a"]
会成为
hsh = {"a": [0,3], "b": [1], "c": [2]}
我想以一种功能性的方式(而不是一个大的旧 for 循环)来做到这一点,但我有点卡住了
lst = arr.collect.with_index { |item, i| [item, i] }
生产
[["a", 0], ["b", 1], ["c", 2], ["a", 3]]
然后我尝试了 Hash[lst],但我没有得到值中的数组并丢失索引 0
{"a"=>3, "b"=>1, "c"=>2}
如何以实用的方式获得所需的输出?我觉得有点像
Hash[arr.collect.with_index { |item, i| [item, item[i] << i || [i] }]
但这不会产生任何结果。
注意:尽量不要这样做
hsh = {}
arr.each.with_index do |item, index|
if hsh.has_key?(item)
hsh[item] << index
else
hsh[item] = [index]
end
end
hsh