Как объединить хеши во вложенный массив? - PullRequest
0 голосов
/ 08 июля 2020

Я изо всех сил пытаюсь преобразовать этот массив:

arr = [
  {:type=>"Type One",
   :data=>[
     {'Wed, 01 Apr 2020'=>11.0},
     {'Fri, 01 May 2020'=>0.0},
     {'Mon, 01 Jun 2020'=>1081.5},
     {'Wed, 01 Jul 2020'=>0.0}
   ]
  },
  {:type=>"Type Two",
   :data=>[
     {'Wed, 01 Apr 2020'=>19.55},
     {'Fri, 01 May 2020'=>0.0},
     {'Mon, 01 Jun 2020'=>68.56},
     {'Wed, 01 Jul 2020'=>200.0}
   ]
  }
] 

в этот массив:

[{:type=>"Type One",
  :data=>{'Wed, 01 Apr 2020'=>11.0, 'Fri, 01 May 2020'=>0.0,
          'Mon, 01 Jun 2020'=>1081.5, 'Wed, 01 Jul 2020'=>0.0}},
 {:type=>"Type Two",
  :data=>{'Wed, 01 Apr 2020'=>19.55, 'Fri, 01 May 2020'=>0.0,
          'Mon, 01 Jun 2020'=>68.56, 'Wed, 01 Jul 2020'=>200.0}}]

Как вы видите, я использую sh для преобразования значения :data в каждом ha sh в arr от массива одноключевых хэшей до одного ha sh.

Ответы [ 2 ]

2 голосов
/ 08 июля 2020
arr.map do |h|
  h.each_with_object({}) do |(k,v),g|
    g[k] = (k == :data) ? v.reduce(:merge) : v
  end
end
  #=> [{:type=>"Type One",
  #     :data=>{'Wed, 01 Apr 2020'=>11.0, 'Fri, 01 May 2020'=>0.0,
  #             'Mon, 01 Jun 2020'=>1081.5, 'Wed, 01 Jul 2020'=>0.0}},
  #    {:type=>"Type Two",
  #     :data=>{'Wed, 01 Apr 2020'=>19.55, 'Fri, 01 May 2020'=>0.0,
  #             'Mon, 01 Jun 2020'=>68.56, 'Wed, 01 Jul 2020'=>200.0}}]

Если, например,

v = [{'Wed, 01 Apr 2020'=>11.0}, {'Fri, 01 May 2020'=>0.0},
     {'Mon, 01 Jun 2020'=>1081.5}, {'Wed, 01 Jul 2020'=>0.0}]

, то

v.reduce(:merge)
  #=> {"Wed, 01 Apr 2020"=>11.0, "Fri, 01 May 2020"=>0.0,
  #    "Mon, 01 Jun 2020"=>1081.5, "Wed, 01 Jul 2020"=>0.0}

Это можно рассматривать как сокращение для:

v.reduce { |h, g| h.merge(g) }

См. Enumerable # reduce (он же inject) и Hash # merge .

1 голос
/ 08 июля 2020

Похоже, что вам нужно объединить массив маленьких хэшей в один ha sh. Для этого вы можете использовать метод .inject() Array:

a = [{Wed, 01 Apr 2020=>11.0}, {Fri, 01 May 2020=>0.0}]}
a.inject(:merge!)
=> {Wed, 01 Apr 2020=>11.0, Fri, 01 May 2020=>0.0}

Inject объединяет все элементы в массиве с помощью метода (или блока). Передача ему :merge! приводит к тому, что каждая итерация деструктивно объединяет ha sh, поэтому у вас не будет лишних трат на создание маленьких копий ha sh в процессе работы. перебрать внешний массив и использовать .inject, чтобы преобразовать массив data в ha sh.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...