Ruby 2.6.3中合并两个Hash生成指定结构新Hash的需求
合并两个Ruby Hash生成嵌套结构的新Hash
这里有个简洁的方案来实现你想要的效果,利用Ruby的each_with_object和Hash#fetch方法,完美覆盖所有场景(包括payment_transaction_data为空的情况):
invoiced_data = {"Jan 2020"=>0, "Feb 2020"=>0, "Mar 2020"=>0, "Apr 2020"=>0, "May 2020"=>0, "Jun 2020"=>0, "Jul 2020"=>0.331027548e7, "Aug 2020"=>0.31668664e6, "Sep 2020"=>0, "Oct 2020"=>0, "Nov 2020"=>0, "Dec 2020"=>0} payment_transaction_data = {"Jul 2020"=>400.0, "Aug 2020"=>26924.0} # 生成目标Hash combined_data = invoiced_data.each_with_object({}) do |(month, invoiced_amount), result_hash| result_hash[month.to_sym] = { Invoiced_data: invoiced_amount, payment_transaction_data: payment_transaction_data.fetch(month, 0.0) } end # 查看结果 p combined_data
代码细节说明:
each_with_object({}):遍历invoiced_data的每一组键值对,同时逐步构建新Hash,确保最终结果和原invoiced_data的键集合完全一致。month.to_sym:把原字符串格式的月份键转为符号(和你给出的期望结果格式匹配),如果需要保留字符串键,直接去掉.to_sym即可。Invoiced_data: invoiced_amount:直接取用invoiced_data对应月份的值,Ruby会自动将科学计数法的数值(比如0.331027548e7)解析为常规浮点数(3310275.48)。payment_transaction_data.fetch(month, 0.0):用fetch方法安全获取支付数据,若当前月份不在支付Hash中,自动返回默认值0.0,空Hash的情况也能完美处理。
运行这段代码后,就能得到和你预期完全一致的结果。
内容的提问来源于stack exchange,提问作者urjit on rails
相关产品推荐
相关产品推荐

