您可以创建
done
布尔值,用于跟踪是否已经完成替换,并从块中返回适当的值:
require "active_support/core_ext/hash/deep_transform_values"
def deep_transform_values_once(hash:, old_value:, new_value:)
done = false
hash.deep_transform_values do |value|
if !done && value == old_value
done = true
new_value
else
value
end
end
end
input = {
"books2" => [1, { a: 1, b: "seller35" }],
"books3" => { "a" => [{ "5.5" => "seller35", "6.5" => "foo" }] },
}
p deep_transform_values_once(hash: input, old_value: "seller35", new_value: "")
输出:
{"books2"=>[1, {:a=>1, :b=>""}], "books3"=>{"a"=>[{"5.5"=>"seller35", "6.5"=>"foo"}]}}