首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带散列的和数组

带散列的和数组
EN

Stack Overflow用户
提问于 2013-11-20 11:04:15
回答 5查看 671关注 0票数 2

如何在这两个散列数组之间执行加法,例如,我想从第一个数组中获取第一个哈希和和number, s_number, l_number,从第二个数组获取第一个散列,和将取决于created_at,如果第一个数组中的created_at与第二个数组中的created_at相等,则执行+。请看一看我希望得到的回报,因为我不知道如何更好地解释这一点。

谢谢

代码语言:javascript
复制
raw_data = [
        [
            {"created_at"=>"2013-11-17","number"=>0,"s_number"=>0,"l_number"=>0},
            {"created_at"=>"2013-11-18","number"=>6,"s_number"=>1,"l_number"=>4},
            {"created_at"=>"2013-11-19","number"=>1,"s_number"=>1,"l_number"=>1},
            {"created_at"=>"2013-11-20","number"=>0,"s_number"=>0,"l_number"=>0}
        ],
        [
            {"created_at"=>"2013-11-17","number"=>2,"s_number"=>3,"l_number"=>4},
            {"created_at"=>"2013-11-18","number"=>1,"s_number"=>41,"l_number"=>1},
            {"created_at"=>"2013-11-19","number"=>5,"s_number"=>45,"l_number"=>7},
            {"created_at"=>"2013-11-20","number"=>7,"s_number"=>8,"l_number"=>2}    
        ]
        ]

应该归还什么?

代码语言:javascript
复制
[
        {"created_at"=>"2013-11-17","number"=>2,"s_number"=>3,"l_number"=>4},
        {"created_at"=>"2013-11-18","number"=>7,"s_number"=>42,"l_number"=>5},
        {"created_at"=>"2013-11-19","number"=>6,"s_number"=>46"l_number"=>8},
        {"created_at"=>"2013-11-20","number"=>7,"s_number"=>8,"l_number"=>2}    
]

更新散列格式与我发布的内容不同:

代码语言:javascript
复制
{:created_at=>Sun, 17 Nov 2013, :number=>0, :s_number=>0, :l_number=>0}
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2013-11-20 11:31:30

首先,您需要对数组进行求和:

代码语言:javascript
复制
raw_data.sum

这将归还如下的东西:

代码语言:javascript
复制
    [
        {"created_at"=>"2013-11-17","number"=>0,"s_number"=>0,"l_number"=>0},
        {"created_at"=>"2013-11-18","number"=>6,"s_number"=>1,"l_number"=>4},
        {"created_at"=>"2013-11-19","number"=>1,"s_number"=>1,"l_number"=>1},
        {"created_at"=>"2013-11-20","number"=>0,"s_number"=>0,"l_number"=>0}
        {"created_at"=>"2013-11-17","number"=>2,"s_number"=>3,"l_number"=>4},
        {"created_at"=>"2013-11-18","number"=>1,"s_number"=>41,"l_number"=>1},
        {"created_at"=>"2013-11-19","number"=>5,"s_number"=>45,"l_number"=>7},
        {"created_at"=>"2013-11-20","number"=>7,"s_number"=>8,"l_number"=>2}    
    ]

现在,我们需要按'created_at‘键对元素进行分组:

代码语言:javascript
复制
raw_data.sum.group_by{|element| element['created_at']}

这将导致:

代码语言:javascript
复制
{
    "2013-11-17" => [
        {"created_at"=>"2013-11-17","number"=>0,"s_number"=>0,"l_number"=>0},
        {"created_at"=>"2013-11-17","number"=>2,"s_number"=>3,"l_number"=>4},
      ],
    "2013-11-18" => [
        {"created_at"=>"2013-11-18","number"=>6,"s_number"=>1,"l_number"=>4},
        {"created_at"=>"2013-11-18","number"=>1,"s_number"=>41,"l_number"=>1}
      ], ...           
}

我们只需要这个散列的值:

代码语言:javascript
复制
raw_data.sum.group_by{|element| element['created_at']}.values

# =>
    [
      [
        {"created_at"=>"2013-11-17","number"=>0,"s_number"=>0,"l_number"=>0},
        {"created_at"=>"2013-11-17","number"=>2,"s_number"=>3,"l_number"=>4},
      ],
      [
        {"created_at"=>"2013-11-18","number"=>6,"s_number"=>1,"l_number"=>4},
        {"created_at"=>"2013-11-18","number"=>1,"s_number"=>41,"l_number"=>1}
      ], ...           
}

现在,我们需要将每个散列数组映射到一个散列。为此,我们将使用带有块的注入和合并函数:

代码语言:javascript
复制
raw_data.sum.group_by{|element| element[:created_at]}.values.map{|a| a.inject({}) {|result, hash| result.merge(hash) {|key, old_value, new_value| key == :created_at ? old_value : old_value + new_value}}}



# =>

[
    {"created_at"=>"2013-11-17","number"=>2,"s_number"=>3,"l_number"=>4},
    {"created_at"=>"2013-11-18","number"=>7,"s_number"=>42,"l_number"=>5},
    {"created_at"=>"2013-11-19","number"=>6,"s_number"=>46"l_number"=>8},
    {"created_at"=>"2013-11-20","number"=>7,"s_number"=>8,"l_number"=>2}    
]
票数 2
EN

Stack Overflow用户

发布于 2013-11-20 11:29:20

我会这样做:

代码语言:javascript
复制
result = raw_data.flatten.each_with_object({}) do |hash, result|
  date = hash.delete("created_at")
  result[date] = Hash.new(0) unless result[date]
  hash.each{|key, val| result[date][key] += val}
end.map{|date, hash| hash["created_at"] = date; hash}

p result #=> [{"number"=>2, "s_number"=>3, "l_number"=>4, "created_at"=>"2013-11-17"}, ...

或者也许更好,因为它将保持散列的顺序:

代码语言:javascript
复制
result = raw_data.flatten.group_by{|x|x["created_at"]}.values.map do |x| 
  x.inject do |result, hash| 
    result.merge(hash){|key, old, new| old.is_a?(String) ? old : old + new }
  end
end

p result #=> [{"created_at"=>"2013-11-17", "number"=>2, "s_number"=>3, "l_number"=>4},  {"created_at"=>"2013-11-18", "number"=>7, "s_number"=>42, "l_number"=>5} ...
票数 1
EN

Stack Overflow用户

发布于 2013-11-20 11:33:50

代码语言:javascript
复制
output = []

raw_data.flatten.group_by {|x| x[:created_at].to_s}.each do |key, values|
  temp_hash = { :created_at => key.to_date }
  [:number, :s_number, :l_number].each do |attr|
    temp_hash[attr] = values.collect{|w| w[attr]}.sum
  end
  output << temp_hash
end

# output will contain your result
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20094170

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档