我有以下
JSON数据:
{ "events": { "event": [ { "city":"Birmingham","state":"AL","country":"US","lat":"33.5206608","lng":"-86.80249","status":"Delivered","occured_at":"2012-04-06 14:17:00 UTC" },{ "city":"Birmingham","status":"Out For Delivery","occured_at":"2012-04-06 04:44:00 UTC" },"status":"Arrival Scan","occured_at":"2012-04-05 19:07:00 UTC" },{ "city":"Doraville","state":"GA","lat":"33.8981579","lng":"-84.2832564","status":"Departure Scan","occured_at":"2012-04-05 17:08:00 UTC" },"occured_at":"2012-04-05 11:15:00 UTC" },{ "city":"Spartanburg","state":"SC","lat":"34.9495672","lng":"-81.9320482","occured_at":"2012-04-05 08:42:00 UTC" },"occured_at":"2012-04-05 08:21:00 UTC" },{ "city":"Greensboro","state":"NC","lat":"36.0726354","lng":"-79.7919754","occured_at":"2012-04-05 04:45:00 UTC" },"status":"Origin Scan","occured_at":"2012-04-05 00:11:00 UTC" },{ "city":null,"state":null,"status":"Billing information Received","occured_at":"2012-04-04 18:20:27 UTC" } ] } }
我需要做的是通过城市,州和国家的组合对数据进行分组,但仍然返回每个项目的数据.
例如,分组由“伯明翰,美国AL,美国”,但仍然能够迭代每个事件的状态(即交付,交付交付,到达扫描).
解决方法
你想要的魔力是
Enumerable#group_by
:
require 'json' all = JSON.parse(DATA.read)['events']['event'] all.group_by{ |h| [h['city'],h['state'],h['country']] }.each do |loc,events| puts "'#{loc.join(',')}': #{events.length} event#{:s if events.length!=1}" print "--> " puts events.map{ |e| e['status'] }.join(',') end #=> 'Birmingham,AL,US': 3 events #=> --> Delivered,Out For Delivery,Arrival Scan #=> 'Doraville,GA,US': 2 events #=> --> Departure Scan,Arrival Scan #=> 'Spartanburg,SC,Arrival Scan #=> 'Greensboro,NC,Origin Scan #=> ',US': 1 event #=> --> Billing information Received
请注意,在上面,loc是从group_by计算的块返回的三元素数组,而events是同一组中所有项的数组.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。