Как сгруппировать элементы подмассива на основе двух элементов - PullRequest
0 голосов
/ 27 августа 2018

У меня есть следующие данные:

input = [
  ["account1",10,"Dr"],
  ["account1",20,"Dr"],
  ["account2",15,"Cr"],
  ["account1",25,"Cr"],
  ["account2",10,"Dr"],
  ["account1",10,"Cr"]
]

Я пытаюсь получить суммы по счету и типу транзакции, т.е. Dr или Cr. Мне нужен вывод, как показано ниже:

output = {
  ["account1","Dr"] => 30,
  ["account1","Cr"] => 35,
  ["account2","Dr"] => 10,
  ["account2","Cr"] => 15
}

Я могу суммировать сумму, основываясь только на счете, используя:

input.each_with_object(Hash.new(0)) {|(f,g), h| h[f] += g}
# => {"account1"=>65, "account2"=>25}

Ответы [ 3 ]

0 голосов
/ 27 августа 2018

Вы можете сделать это:

input.each_with_object(Hash.new(0)) {|(f,g,i), h| h[[f,i]] += g}

=> {["account1", "Dr"]=>30, ["account2", "Cr"]=>15, ["account1", "Cr"]=>35, ["account2", "Dr"]=>10}
0 голосов
/ 28 августа 2018
input.group_by { |acc,_,title| [acc, title] }.
      transform_values { |v| v.sum { |a| a[1] } }
  #=> {["account1", "Dr"]=>30, ["account2", "Cr"]=>15, ["account1", "Cr"]=>35,
  #    ["account2", "Dr"]=>10}

Первый шаг следующий.

input.group_by { |acc,_,title| [acc, title] }
  #=> {
  #    ["account1", "Dr"]=>[["account1", 10, "Dr"], ["account1", 20, "Dr"]],
  #    ["account2", "Cr"]=>[["account2", 15, "Cr"]],
  #    ["account1", "Cr"]=>[["account1", 25, "Cr"], ["account1", 10, "Cr"]],
  #    ["account2", "Dr"]=>[["account2", 10, "Dr"]]
  #   }
0 голосов
/ 27 августа 2018
output = Hash.new(0)  # set a default value of zero, avoiding nil
input.each do |account, amount, transaction|
    output[[account, transaction]] += amount
end

output #  {["account1", "Dr"]=>30, ["account2", "Cr"]=>15, ["account1", "Cr"]=>35, ["account2", "Dr"]=>10}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...