【问题标题】:Ruby on Rails - Hash of Arrays, group by and sum by with many columnsRuby on Rails - 数组散列、分组和总和与多列
【发布时间】:2015-02-08 18:02:52
【问题描述】:

我对这个主题有类似的问题 Ruby on Rails - Hash of Arrays, group by and sum by column name

但是,我的问题是 group by 和 sum by 有很多列而不是一列。

例如:我的哈希

[
    {"idx"=>"1234", "account"=>"abde", "money"=>"4.00", "money1"=>"1.00", "order"=>"00001", "order1"=>"1"},
    {"idx"=>"1235", "account"=>"abde", "money"=>"2.00", "money1"=>"1.00", "order"=>"00001", "order1"=>"1"},
    {"idx"=>"1235", "account"=>"abde", "money"=>"3.00", "money1"=>"1.00", "order"=>"00002", "order1"=>"2"}
]

这样的结果

[
    {"idx"=>"1234", "account"=>"abde", "money"=>"6.00", "money1"=>"2.00","order"=>"00001", "order1"=>"1"},
    {"idx"=>"1234", "account"=>"abde", "money"=>"3.00", "money1"=>"1.00","order"=>"00002", "order1"=>"2"}
]

这样的电话group_hashes arr, ["order","order1"], ["money","money1"]

我在合并中尝试了一个循环!然而,结果是错误的。 请教我解决这个问题。对不起我的愚蠢想法。

【问题讨论】:

  • 为什么money1 变成3.00。我虽然他们应该是2.001.00
  • @falsetru 你是对的!那是我的错。
  • @falsetru 我在stackoverflow.com/questions/28469348/… 有另一个类似的问题你能看看吗?再次感谢

标签: ruby-on-rails ruby arrays hash


【解决方案1】:

Usnig Enumerable#group_by,您可以迭代按orderorder1 键分组的哈希数组。

然后合并哈希(通过总结moneymoney1 条目):

a = [
  {"idx"=>"1234", "account"=>"abde", "money"=>"4.00", "money1"=>"1.00", "order"=>"00001", "order1"=>"1"},
  {"idx"=>"1235", "account"=>"abde", "money"=>"2.00", "money1"=>"1.00", "order"=>"00001", "order1"=>"1"},
  {"idx"=>"1235", "account"=>"abde", "money"=>"3.00", "money1"=>"1.00", "order"=>"00002", "order1"=>"2"}
]
a.group_by { |x| x.values_at('order', 'order1') }.map {|key, hashes|
  result = hashes[0].clone
  ['money', 'money1'].each { |key|
    result[key] = hashes.inject(0) { |s, x| s + x[key].to_f }
  }
  result
}
# => [{"idx"=>"1234", "account"=>"abde", "money"=>6.0, "money1"=>2.0, "order"=>"00001", "order1"=>"1"},
#     {"idx"=>"1235", "account"=>"abde", "money"=>3.0, "money1"=>1.0, "order"=>"00002", "order1"=>"2"}]

group_keys = ['order', 'order1']
sum_keys = ['money', 'money1']
a.group_by { |x| x.values_at(*group_keys) }.map {|key, hashes|
  result = hashes[0].clone
  sum_keys.each { |key|
    result[key] = hashes.inject(0) { |s, x| s + x[key].to_f }
  }
  result
}

【讨论】:

  • 工作。但是,我在结果中看不到键“order1”。
  • @VuLe,我不明白你的意思:not see key "order1" in result.
  • @VuLe,见:ideone.com/BQQSVz。我可以在结果输出中看到order1
  • 我只是打印出结果。我没有看到 "order1" 键 [{..., "order1" => "1"}, {..., "order1" => "2"}]。
  • @VuLe,正如您在链接中看到的,我可以看到order1 键。您能否发布另一个包含确切代码、输出和预期输出的问题?
猜你喜欢
  • 2012-12-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-01
  • 2016-05-15
相关资源
最近更新 更多