在数组的哈希上使用uniq

时间:2018-03-05 07:51:02

标签: ruby hash

给定数组的哈希值:

a =
{:b => [:x, :x, :y], :c => [:x, :z, :z]}

我想从散列中的数组中删除所有重复项。

预期结果:

a
# => {:b => [:x, :y], :c => [:x, :z]}

什么行不通:

a.each { |e| e.uniq! }

也不是:

a.each { |e| e = e.uniq } # should be the same as above, really

我该如何做到这一点?

2 个答案:

答案 0 :(得分:2)

Hash#transform_values

a.transform_values(&:uniq) #=> {:b=>[:x, :y], :c=>[:x, :z]}

transform_values!就地修改。这两种方法都需要Ruby> = 2.4。

Array#map

使用map用于Ruby< 2.4。

a.map { |k,arr| [k,arr.uniq] }.to_h #=> {:b=>[:x, :y], :c=>[:x, :z]}

答案 1 :(得分:2)

如果您想为每个哈希值创建一个新数组,那么@ SagarPandya的答案将起作用,但您也可以对该数组进行就地修改。

a = {:b => [:x, :x, :y], :c => [:x, :z, :z]}

a.each_value(&:uniq!) # => {:b=>[:x, :y], :c=>[:x, :z]}
a # => {:b=>[:x, :y], :c=>[:x, :z]}