Ruby:如何将多个JSON对象的值求和为一个对象?



我有两个JSON对象,像这样:

object1 = {
"Oct 2019": 100,
"Nov 2019": 100,
"Dec 2019": 100,
"Jan 2020": 100,
"Feb 2020": 100,
"Mar 2020": 100,
"Apr 2020": 100,
"May 2020": 100,
"Jun 2020": 100,
"Jul 2020": 100,
"Aug 2020": 100,
"Sep 2020": 100
}
object2 = {
"Oct 2019": 50,
"Nov 2019": 50,
"Dec 2019": 50,
"Jan 2020": 50,
"Feb 2020": 50,
"Mar 2020": 50,
"Apr 2020": 50,
"May 2020": 50,
"Jun 2020": 50,
"Jul 2020": 50,
"Aug 2020": 50,
"Sep 2020": 50
}

我如何将object1object2的值相加,使结果json对象看起来如下所示?:

result = {
"Oct 2019": 150,
"Nov 2019": 150,
"Dec 2019": 150,
"Jan 2020": 150,
"Feb 2020": 150,
"Mar 2020": 150,
"Apr 2020": 150,
"May 2020": 150,
"Jun 2020": 150,
"Jul 2020": 150,
"Aug 2020": 150,
"Sep 2020": 150
}

(本例中每个月的值都是相同的,但在我的应用程序中它们都是不同的值)

有很多方法可以做到这一点,但我发现最简单的是使用hash# merge的形式,它使用一个块来计算出现在合并的两个散列中的键值。

object1.merge(object2) { |_k,v1,v2| v1+v2 }
# = {:"Oct 2019"=>150, :"Nov 2019"=>150, :"Dec 2019"=>150,
#    :"Jan 2020"=>150, :"Feb 2020"=>150, :"Mar 2020"=>150,
#    :"Apr 2020"=>150, :"May 2020"=>150, :"Jun 2020"=>150,
#    :"Jul 2020"=>150, :"Aug 2020"=>150, :"Sep 2020"=>150}

文档中定义了三个块变量_k,v1v2。按照惯例,我在通用密钥(_k)的名称开头加了一个下划线,向读者表明它不在块计算中使用。


如果有三个或更多这样的散列要合并,则写入:

object1.merge(object2, object3, ...) { |_k,v1,v2| v1+v2 }

另一种方法很简单:

keys = (object1.keys + object2.keys).uniq
#=> [:"Oct 2019", :"Nov 2019",..., :"Sep 2020"]
keys.each_with_object({}) do |k,h|
h[k] = object1.fetch(k,0) + object2.fetch(k,0)
end
#=> {:"Oct 2019"=>150, :"Nov 2019"=>150,..., :"Sep 2020"=>150}

看到散列#取回。

可以用objectx[k].to_i代替objectx.fetch(k,0),作为nil.to_i #=> 0,但我不认为读起来很好。

这可以用显而易见的方式扩展到对三个或多个哈希值求和。

最新更新