繁体   English   中英

铁轨分组哈希数组

[英]rails grouping an array of hashes

我知道这是一个简单的问题,但对我来说却很沮丧,我尝试了多个小时而没有做到,所以我希望可以找到答案,

我有这样的哈希数组

array = [{date: 1, branch: 1, value: "100"}, {date: 1, branch: 2, value: "200"}, {date: 2, branch: 1, value: "500"}, {date: 3, branch: 2, value: "500"}, {date: 3, branch: 3, value: "300"}]

我想这样分组

data = [{date: 1, 1: "100", 2: "200"}, {date: 2, 1: "500"}, {date: 3, 2: "500", 3: "300"}]

在数组= [{date:1,branch:1,value:“ 100”}}中,我要取branch和value的值并将其组合为1:“ 100”

无论如何我都可以做到,如果有使用循环或方法时的情况就没有问题

可能可以缩短,但是可以起作用:

array.group_by { |h| h[:date] }.map do |k, v|
  [:date, k, *v.map { |h| [h[:branch], h[:value]] }]
end.map { |x| Hash[*x.flatten] }
# => [{:date=>1, 1=>"100", 2=>"200"}, {:date=>2, 1=>"500"}, {:date=>3, 2=>"500", 3=>"300"}]

另一种解决方案

array = [{date: 1, branch: 1, value: "100"}, {date: 1, branch: 2, value: "200"}, {date: 2, branch: 1, value: "500"}, {date: 3, branch: 2, value: "500"}, {date: 3, branch: 3, value: "300"}]
data = array.inject({}) do |res, val| 

  if res[val[:date]]
    res[val[:date]].merge!({val[:branch] => val[:value]})
  else 
    res.merge!(val[:date] => {val[:branch] => val[:value]})
  end  
  res  
end
puts data.collect{|key, val| {date: key}.merge!(val)}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM