Rail преобразовать массив в группу - PullRequest
0 голосов
/ 24 августа 2018

Я пытаюсь преобразовать один из моих массивов в некоторый формат, где он может преобразовать себя в формат таблицы.

У меня есть массив, который:

  [
    {
    id: 1,
    Revenue_Account: "Revenue Receipt",
    Amount: 59567,
    Year: "2012-13",
    created_at: "2018-08-21T06:30:17.000Z",
    updated_at: "2018-08-21T06:30:17.000Z"
    },
    {
    id: 2,
    Revenue_Account: "Revenue Expenditure ",
    Amount: 54466,
    Year: "2012-13",
    created_at: "2018-08-21T06:30:17.000Z",
    updated_at: "2018-08-21T06:30:17.000Z"
    },

    ...

]

Полный код моего массива ссылка на мой фактический массив

Я хочу, чтобы эти данные были преобразованы в этот формат:

data: [
        {
        id: 1,
        Sector: "Revenue Receipt",
        2012-13: 59567,
        2013-14: 68919,
        2014-15: 72570,
        2015-16: 96123,
        2016-17: 105585,
        2017-18_BE: 137158,
        },
        {
        id: 2,
        Sector: "Revenue Expenditure",
        2012-13: 59567,
        2013-14: 68919,
        2014-15: 72570,
        2015-16: 96123,
        2016-17: 105585,
        2017-18_BE: 137158,
        },
  ....
]

Я использую этот код для группировки моего массива:

 group = b.group_by{|data| data[:Revenue_Account]}

это группирует мои данные, как я ожидаю, чтобы достичь своей цели, я пробую этот код.

  group = b.group_by{|data| data[:Revenue_Account]}
  du = []
  group.each do |i|
  du.push({Sector:i[0]})
  end

Это дает мне мудрый сектор, как я могу добавить год в моем коде.

Ответы [ 2 ]

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

Другой вариант, непосредственно манипулирующий массивом.

array_of_data = array
.each { |h| h[:Sector] = h.delete(:Revenue_Account) }
.each { |h| h[h[:Year]] = h[:Amount]}
.each { |h| h.delete_if{ |k, _| k == :created_at || k == :updated_at || k == :id || k == :Year || k == :Amount} }
.group_by { |h| h[:Sector] }
.values.map { |a| a.inject(:merge) }

Тогда просто:

h = {}
h[:data] = array_of_data

Чтобы понять, что происходит в коде, просто построчно выводите результат объявления, как:

p array
    .each { |h| h[:Sector] = h.delete(:Revenue_Account) }

Тогда:

p array
    .each { |h| h[:Sector] = h.delete(:Revenue_Account) }
    .each { |h| h[h[:Year]] = h[:Amount]}

И так далее ...

Чтобы понять .inject(:merge), см. Здесь Rails отображает массив хэшей на один хеш

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

У вас не может быть одного идентификатора, потому что вы группируете множество записей с разными идентификаторами, но вы получите массив в том формате, который вы запрашиваете:

grouped = {}
b.each do |x|
  grouped[x[:Revenue_Account]] ||= {}
  grouped[x[:Revenue_Account]][:Sector] = x[:Revenue_Account]
  grouped[x[:Revenue_Account]][x[:Year]] = x[:Amount]
end

return {data: grouped.values}

Что тебя достает:

{
  :data=>[
    {
      :Sector=>"Revenue Receipt",
      "2012-13"=>59567,
      "2013-14"=>68919,
      "2014-15"=>78417,
      "2015-16"=>96123,
      "2016-17"=>105585,
      "2017-18_BE"=>137158
    },  
    {
      :Sector=>"Revenue Expenditure ",
      "2012-13"=>54466,
      "2013-14"=>62477,
      "2014-15"=>72570,
      "2015-16"=>83616,
      "2016-17"=>94765,
      "2017-18_BE"=>122603
    },
  ]
}

Мы создаем новый хеш, перебирая исходный хеш и создавая ключи хеша, если они не существуют. Затем мы начинаем присваивать значения так, как вы хотите, чтобы они были в выводе. На каждой итерации мы создаем новый ключ в этом хэше для значения Revenue_Account, если мы впервые его увидели. Затем мы присваиваем выходные данные и дату и сумму этой конкретной выручки. Таким образом, для значения «Выручка» это выглядит так:

  • Сгруппированный хэш начинается как пустой
  • На первой итерации мы видим, что группа ["Квитанция о доходах"] равна нулю, поэтому мы инициализируем ее пустым хешем через || = (назначить, если ноль)
  • Затем мы присваиваем: Sector => "Квитанция о доходах" и год и сумму этой записи, "2012-13" => 59567
  • Наш сгруппированный хеш выглядит следующим образом: {"Квитанция о доходах" => {: Сектор => "Квитанция о доходах", "2012-13" => 59567}
  • На следующей итерации мы видим, что группа ["Квитанция о доходах"] не ноль, поэтому || = не переопределяет ее с пустым хешем
  • Затем мы присваиваем: Sector => "Квитанция о доходах" и год и сумму этой записи, "2012-14" => 68919, что добавляет новый ключ / значение к существующему хешу
  • Наш сгруппированный хеш теперь выглядит следующим образом: {"Квитанция о доходах" => {: Сектор => "Квитанция о доходах", "2012-13" => 59567, "2012-14" => 68919}
  • После того, как мы проанализируем весь массив, у нас теперь есть хеш, который имеет ключ Доход_Аккаунта, и значения, которые выглядят как ожидаемый результат хэширования.
  • Мы отбрасываем ключ и возвращаем только хеш-значения, что дает вам окончательный результат.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...