Как оптимизировать метод слияния двух хешей [RUBY]

Я создал метод, который объединяет два хэша, у которых значения одного из ключей совпадают. Метод можно увидеть ниже:

  def self.hash_merge_on_location(base, additions_arr, location)
    base.each_with_index { |b_hash,b_index|
      additions_arr.each do |addition|
        addition.each_with_index { |a_hash,a_index|
          if b_hash[location] == a_hash[location]
            base[b_index] = b_hash.merge(a_hash)
          end
        }
      end 
    }   
    base
  end 

Итак, мой вопрос: как я могу улучшить этот метод? Прямо сейчас у меня есть base (массив хэшей), adds_arr (массив массива хэшей) и location (ключ для сравнения) в качестве моих параметров, и я перебираю хеш в моем базовом массиве, а затем сравниваю это с каждым массивом хешей в мои adds_arr. Наконец, я проверяю, совпадает ли текущее хеш-значение в моем массиве в моем adds_arr с хеш-значением в моем базовом массиве.

Пример будет следующим:

Базовый массив

[{"loan_number" => 10808, "spec_type" => "New"}, 
 {"loan_number" => 10809, "spec_type" => "Old"}]

Массив дополнений

[
 [{"loan_number" => 10808, "new_field" => 10}, 
  {"loan_number" => 12383, "new_field" => 19}],
 [{"loan_number" => 10809, "new_field" => 11}]
]

Итак, прямо сейчас с моим текущим кодом с вводом местоположения "номер_суды" вывод hash_merge_on_location будет следующим:

Выход

[{"loan_number" => 10808, "spec_type" => "New", "new_field" => 10},
 {"loan_number" => 10809, "spec_type" => "Old", "new_field" => 11}]

Могу ли я как-нибудь оптимизировать свой метод в его нынешнем виде? Или что-нибудь еще, что я мог сделать, чтобы это стало лучше?

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

juvian 05.09.2018 18:33

Не могли бы вы подробнее рассказать, как это сделать, или указать мне ресурс? Спасибо за помощь

FrankTheTank 05.09.2018 18:37

Создайте новый хеш с именем index. Выполните итерацию по базовому массиву и поместите ключ (местоположение) в индекс со ссылкой (или индексом массива, если рубин не имеет ссылок) на элемент базового массива. Затем переберите добавления, и вы можете найти элемент базового массива с этим местоположением, используя index [location]

juvian 05.09.2018 18:40

Поэтому, когда вы говорите поместить ключ в index как location, вы имеете в виду, что фактическое значение, как в моем случае Index, будет {10808 => 0}. Чтобы значение местоположения указывало на индекс в базовом массиве?

FrankTheTank 05.09.2018 18:47

Верно :). {10808 => 0, 10809 => 1}

juvian 05.09.2018 18:48

Ах, имеет смысл, большое спасибо за помощь!

FrankTheTank 05.09.2018 18:57

С самого начала вам нужно изложить словами, для чего предназначен ваш код. Это как-то связано с объединением хешей, имеющих общий ключ, но этого недостаточно. Вы заставляете читателей пытаться выяснить вашу цель из вашего кода, что, если и отталкивает, и это, несомненно, является причиной, по которой на сегодняшний день не было опубликовано никаких ответов. Кроме того, поскольку ссылки имеют тенденцию к разрыву со временем, как правило, не рекомендуется использовать их (например, «Выполнить фрагмент кода»), как вы. Вместо этого просто покажите возвращаемое значение для каждой строки примера. Если читатели хотят скопировать ваш код, они могут просто вырезать и вставить.

Cary Swoveland 05.09.2018 19:44

Спасибо за отзыв, я обязательно сделаю это в будущем

FrankTheTank 05.09.2018 20:04
Структурированный массив Numpy
Структурированный массив Numpy
Однако в реальных проектах я чаще всего имею дело со списками, состоящими из нескольких типов данных. Как мы можем использовать массивы numpy, чтобы...
T - 1Bits: Генерация последовательного массива
T - 1Bits: Генерация последовательного массива
По мере того, как мы пишем все больше кода, мы привыкаем к определенным способам действий. То тут, то там мы находим код, который заставляет нас...
Что такое деструктуризация массива в JavaScript?
Что такое деструктуризация массива в JavaScript?
Деструктуризация позволяет распаковывать значения из массивов и добавлять их в отдельные переменные.
0
8
66
0

Другие вопросы по теме