如何更新数组中哈希值



编辑**
arr = [{"番茄

"=>2}, {"香蕉"=>3}, {"牛奶"=>1}, {"鸡蛋"=>1}, {"烹饪箔"=>1}, {"苹果"=>4}, {"苹果=>6}]

如何更改值{"apple" => 10}

如何定义功能,例如add在添加相同键时更新值?例如

arr.add{"banana" =>7}
=>
[{"tomato"=>2}, {"banana"=>10}, {"milk"=>"1 gallon"}, {"egg"=>"1 cart"}, {"cooking foil"=>1}, {"apple"=>10}]

您可以定义一个函数,该函数使用 detect 来查找给定的键并对其进行编辑。如果密钥尚不存在,则还要添加新条目。像这样:

def add(key, val, arr)
  a = arr.detect{|a| a[key]}
  a ? a[key] = a[key] + val : arr << {key => val}
  arr
end
arr = [{"tomato"=>2}, {"banana"=>3}, {"milk"=>"1 gallon"}, {"egg"=>"1 cart"}, {"cooking foil"=>1}, {"apple"=>4}, {"apple" =>6}]
add("apple", 10, arr)
# => [{"tomato"=>2}, {"banana"=>3}, {"milk"=>"1 gallon"}, {"egg"=>"1 cart"}, {"cooking foil"=>1}, {"apple"=>14}, {"apple"=>6}]
add("banana", 6, arr)
# => [{"tomato"=>2}, {"banana"=>9}, {"milk"=>"1 gallon"}, {"egg"=>"1 cart"}, {"cooking foil"=>1}, {"apple"=>14}, {"apple"=>6}]
add("lemon", 3, arr)
# => [{"tomato"=>2}, {"banana"=>9}, {"milk"=>"1 gallon"}, {"egg"=>"1 cart"}, {"cooking foil"=>1}, {"apple"=>14}, {"apple"=>6}, {"lemon"=>3}]

注意:由于您的数组有两个具有相同键的哈希,因此detect只会更改第一次出现。如果要替换所有哈希,可以使用find_all。

我假设所有以"apple"为单个键的哈希都将替换为单个哈希{ "apple"=>tot },其中tot是引用哈希中所有"apple"值的总和。我还假设arr不会被更改,并且{"apple"=>tot}在返回的数组中的位置并不重要。

arr = [{"tomato"=>2}, {"banana"=>3}, {"milk"=>"1 gallon"}, {"egg"=>"1 cart"},
       {"cooking foil"=>1}, {"apple"=>4}, {"apple"=>6}]
apples = arr.select { |h| h.keys.include?("apple") }
arr - apples << { "apple"=> apples.reduce(0) { |tot,h| tot + h["apple"] } }
  #=> [{"tomato"=>2}, {"banana"=>3}, {"milk"=>"1 gallon"},
  #    {"egg"=>"1 cart"}, {"cooking foil"=>1}, {"apple"=>10}] 

步骤:

提取具有"apple"作为单个键的哈希(保持arr不变):

apples = arr.select { |h| h.keys.include?("apple") }
  #=> [{"apple"=>4}, {"apple"=>6}]

计算苹果总数:

tot_apples = apples.reduce(0) { |tot,h| tot + h["apple"] }
  #=> 10 

选择没有"apple"作为键的arr元素(保持arr不变):

a = arr - apples
  #=> [{"tomato"=>2}, {"banana"=>3}, {"milk"=>"1 gallon"},
  #    {"egg"=>"1 cart"}, {"cooking foil"=>1}]

最后,将{ "apple"=>tot_apples }附加到a

a << { "apple"=>tot_apples }
  #=> [{"tomato"=>2}, {"banana"=>3}, {"milk"=>"1 gallon"},
  #    {"egg"=>"1 cart"}, {"cooking foil"=>1}, {"apple"=>10}] 

最新更新