Объединить вложенный массив хэшей в ruby - PullRequest
0 голосов
/ 11 июля 2019

В примере кода nameA и nameB пропущено несколько дат при сравнении с common_count.

Таким образом, ожидаемый выходной хэш должен присутствовать, пропущенные даты со значением будут равны нулю

Заранее спасибо.


    "common_count"=>[
         {20190704=>0}, {20190705=>0}, {20190706=>0}, {20190707=>0},               
         {20190708=>0}, {20190709=>0}, {20190710=>0}, {20190711=>0}
        ]
   }

   {

    "nameA"=>[
         {20190704=>10} {20190706=>50}, {20190707=>10},               
         {20190708=>0}, {20190709=>10}, {20190710=>0}, {20190711=>40}
        ],

   "nameB"=>[
         {20190704=>30}, {20190707=>20},               
         {20190708=>3}, {20190709=>5}, {20190710=>0}, {20190711=>20}
        ], ..... etc
   }

   "nameA"=>[
         {20190704=>10}, {20190705=>0}, {20190706=>50}, {20190707=>10},               
         {20190708=>0}, {20190709=>10}, {20190710=>0}, {20190711=>40}
        ],

   "nameB"=>[
         {20190704=>30},{20190705=>0}, {20190706=>0} {20190707=>20},               
         {20190708=>3}, {20190709=>5}, {20190710=>0}, {20190711=>20}
        ],...etc
   }

Ответы [ 2 ]

1 голос
/ 11 июля 2019

Вы можете просто:

entries = {
  "common_count"=>[
   {"20190704"=>0}, {"20190705"=>0}, {"20190706"=>0}, {"20190707"=>0},               
   {"20190708"=>0}, {"20190709"=>0}, {"20190710"=>0}, {"20190711"=>0}
  ],
  "nameA"=>[
   {"20190704"=>10}, {"20190706"=>50}, {"20190707"=>10},               
   {"20190708"=>0}, {"20190709"=>10}, {"20190710"=>0}, {"20190711"=>40}
 ],
 "nameB"=>[
   {"20190704"=>30}, {"20190707"=>20},               
   {"20190708"=>3}, {"20190709"=>5}, {"20190710"=>0}, {"20190711"=>20}
 ]
}

default = entries.delete("common_count")
default_map = default.inject(:merge)

merged_entries = entries.map do |nameKey, value|
  value_map = value.inject(:merge)
  merged_value_map = default_map.merge(value_map)
  merged_value = merged_value_map.map { |k, v| {k => v} }

  {nameKey => merged_value}
end.inject(:merge)

Обратите внимание, что мне пришлось преобразовать массив хешей в один хеш, чтобы объединить содержимое хешей. Затем я вернул результат хеширования в массив хэшей.

0 голосов
/ 12 июля 2019

Если у вас есть ввод, как показано ниже,

common_count = [{"20190704"=>0}, {"20190705"=>0}, {"20190706"=>0}, {"20190707"=>0}, {"20190708"=>0}, {"20190709"=>0}, {"20190710"=>0}, {"20190711"=>0}]

nameA = [{"20190704"=>10}, {"20190706"=>50}, {"20190707"=>10}, {"20190708"=>0}, {"20190709"=>10}, {"20190710"=>0}, {"20190711"=>40}]

nameB = [{"20190704"=>30}, {"20190707"=>20}, {"20190708"=>3}, {"20190709"=>5}, {"20190710"=>0}, {"20190711"=>20}]

Вы можете запустить следующее, чтобы добавить недостающие ключи из common_count,

[nameA, nameB].each do |arr|
  (common_count.map(&:keys).flatten - arr.map(&:keys).flatten).each do |missing|
    arr.push({missing => 0})
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...