如何合并Ruby数组中同日期哈希并求和容量相关字段?
嘿,这个需求用Ruby自带的Enumerable模块方法就能轻松搞定,我来给你拆解下思路和具体实现:
解决思路与代码实现
核心逻辑
我们可以先把数组按date字段分组,再对每个分组里的哈希做合并处理——把capacity和used_capacity的值分别累加,其他字段(如果有且同日期值一致的话)直接保留即可。
分步实现
1. 按日期分组
用group_by方法把原始数组中date相同的哈希归为一组,键就是日期值,值是对应日期的哈希数组:
grouped_hashes = original_array.group_by { |item| item[:date] }
2. 遍历分组合并数据
对每个分组进行处理:取日期作为基础字段,然后用sum方法计算该组内所有哈希的capacity和used_capacity总和,最后组合成新的哈希:
merged_array = grouped_hashes.map do |date, hashes| { date: date, capacity: hashes.sum { |h| h[:capacity] }, used_capacity: hashes.sum { |h| h[:used_capacity] } } end
完整示例代码
假设你的原始数组是这样的:
original_array = [ { date: "2024-05-01", capacity: 100, used_capacity: 30 }, { date: "2024-05-01", capacity: 50, used_capacity: 20 }, { date: "2024-05-02", capacity: 150, used_capacity: 70 }, { date: "2024-05-03", capacity: 80, used_capacity: 40 } ]
把两步结合起来运行:
original_array = [ { date: "2024-05-01", capacity: 100, used_capacity: 30 }, { date: "2024-05-01", capacity: 50, used_capacity: 20 }, { date: "2024-05-02", capacity: 150, used_capacity: 70 }, { date: "2024-05-03", capacity: 80, used_capacity: 40 } ] merged_array = original_array.group_by { |item| item[:date] }.map do |date, hashes| { date: date, capacity: hashes.sum { |h| h[:capacity] }, used_capacity: hashes.sum { |h| h[:used_capacity] } } end puts merged_array.inspect # 输出结果: # [{:date=>"2024-05-01", :capacity=>150, :used_capacity=>50}, {:date=>"2024-05-02", :capacity=>150, :used_capacity=>70}, {:date=>"2024-05-03", :capacity=>80, :used_capacity=>40}]
额外补充
如果你的哈希里还有其他需要保留的字段(比如site_name,且同日期的该字段值完全一致),可以直接从分组的第一个哈希里取:
merged_array = original_array.group_by { |item| item[:date] }.map do |date, hashes| first_item = hashes.first { date: date, site_name: first_item[:site_name], # 保留额外字段 capacity: hashes.sum { |h| h[:capacity] }, used_capacity: hashes.sum { |h| h[:used_capacity] } } end
这样处理后就能得到你想要的合并数组啦~
内容的提问来源于stack exchange,提问作者Reinier
相关产品推荐
相关产品推荐

