如果值数组,Ruby修改哈希值

时间:2015-01-28 19:44:17

标签: ruby arrays hash

我有这样的红宝石哈希:

hash = {properties: [13], attributes: [11, 15, 15], places: [66]}

我想将我的哈希值转换为:

hash = {properties: 13, attributes: [11, 15], places: 66}

所有数组长度大于1的值,保持原样(数组),所有其他值为第一个元素。用几个ifs尝试了这个,并没有按照我想要的方式进行。

hash.map{ |k,v| { k => v.uniq } }.reduce(&:merge)

3 个答案:

答案 0 :(得分:4)

以下是我的工作方式:

Hash[hash.map { |k ,v| [k, v.size > 1 ? v.uniq : v.first] }]
# => {:properties=>13, :attributes=>[11, 15], :places=>66}
# or 
hash.map { |k ,v| [k, v.size > 1 ? v.uniq : v.first] }.to_h
# => {:properties=>13, :attributes=>[11, 15], :places=>66}

答案 1 :(得分:2)

def convert(h)
  Hash[h.map {|k,v| [k, v.size == 1 ? v.first : v.uniq]}]
end

convert(hash)
# => {:properties=>13, :attributes=>[11, 15], :places=>66}

答案 2 :(得分:1)

这是另一种方式:

hash.merge(hash) { |*_, v| (v.size==1) ? v.first : v.uniq }
 => {:properties=>13, :attributes=>[11, 15], :places=>66}