合并 Ruby 中哈希中的键和值



我有一个哈希值,其中包含模型中城市出现的次数,我想将nilblank键和值合并为一个键和值,并重命名新的单个键

例如

@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}

最新更新