Ruby中哈希数组(Array of Hashes)的状态统计与目标结构生成求助
Ruby: 按Interface统计主机在线/离线状态并生成指定汇总结构
你已经找对了核心的统计思路,只需要调整统计时的键名,并把最终的哈希结构转换为数组即可匹配预期输出。这里是完整的实现代码:
aoh = [{:interface=>"1A", :host=>"host_1", :status=>"online"}, {:interface=>"1A", :host=>"host_2", :status=>"online"}, {:interface=>"1A", :host=>"host_3", :status=>"offline"}, {:interface=>"2A", :host=>"host_4", :status=>"offline"}, {:interface=>"2A", :host=>"host_5", :status=>"offline"}, {:interface=>"2A", :host=>"host_6", :status=>"online"} ] # 初始化统计哈希,直接使用预期的键名 summary_hash = Hash.new { |h, k| h[k] = { online_hosts: 0, offline_hosts: 0 } } # 遍历原始数组,累加对应状态的计数 aoh.each do |item| status_key = item[:status] == 'online' ? :online_hosts : :offline_hosts summary_hash[item[:interface]][status_key] += 1 end # 将统计哈希转换为预期的数组结构 summary = summary_hash.map do |interface, counts| { interface: interface }.merge(counts) end p summary # 输出结果完全匹配预期: # [{:interface=>"1A", :online_hosts=>2, :offline_hosts=>1}, {:interface=>"2A", :online_hosts=>1, :offline_hosts=>2}]
关键调整说明:
- 修正统计键名:初始化哈希时直接用
online_hosts和offline_hosts作为键,避免后续再修改键名的额外操作。 - 转换为数组结构:利用
Hash#map方法,把统计哈希的每个键值对(键是interface字符串,值是计数哈希)转换成包含interface键的子哈希,再合并计数数据,最终得到预期的数组格式。
如果你想更紧凑地实现,也可以把统计和转换合并成一步,但上面的写法更直观,便于理解和维护。
内容的提问来源于stack exchange,提问作者lcchatter
相关产品推荐
相关产品推荐

