我有一个哈希值,其中包含模型中城市出现的次数,我想将nil
或blank
键和值合并为一个键和值,并重命名新的单个键
例如
@raw_data = {nil => 2, "" => 2, "Berlin" => 1, "Paris" => 1}
# to
@corrected_data = {"undefined" => 4, "Berlin" => 1, "Paris" => 1}
我已经研究了 Rubydoc 的合并方法,但它仅在两个键相似时才合并,但在这种情况下,nil
和""
并不相同。
我还可以创建一个新的哈希并添加if nil or blank
语句并将值添加到新的undefined
键中,但这似乎很乏味。
我会做的:
@raw_data = {nil => 2, "" => 2, "Berlin" => 1, "Paris" => 1}
key_to_merge = [nil, ""]
@correct_data = @raw_data.each_with_object(Hash.new(0)) do |(k,v), out_hash|
next out_hash['undefined'] += v if key_to_merge.include? k
out_hash[k] = v
end
@correct_data # => {"undefined"=>4, "Berlin"=>1, "Paris"=>1}
Ruby 无法自动确定您要如何处理由两个"相似"键表示的值。您必须自己定义映射。一种方法是:
def undefined?(key)
# write your definition of undefined here
key.nil? || key.length == 0
end
def merge_value(existing_value, new_value)
return new_value if existing_value.nil?
# your example seemed to add values
existing_value + new_value
end
def corrected_key(key)
return "undefined" if undefined?(key)
key
end
@raw_data = {nil => 2, "" => 2, "Berlin" => 1, "Paris" => 1}
@raw_data.reduce({}) do |acc, h|
k, v = h
acc[corrected_key(k)] = merge_value(acc[corrected_key(k)], v)
acc
end
# {"undefined" => 4, "Berlin" => 1, "Paris" => 1}