Я создал метод, который объединяет два хэша, у которых значения одного из ключей совпадают. Метод можно увидеть ниже:
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}]
Могу ли я как-нибудь оптимизировать свой метод в его нынешнем виде? Или что-нибудь еще, что я мог сделать, чтобы это стало лучше?
Не могли бы вы подробнее рассказать, как это сделать, или указать мне ресурс? Спасибо за помощь
Создайте новый хеш с именем index. Выполните итерацию по базовому массиву и поместите ключ (местоположение) в индекс со ссылкой (или индексом массива, если рубин не имеет ссылок) на элемент базового массива. Затем переберите добавления, и вы можете найти элемент базового массива с этим местоположением, используя index [location]
Поэтому, когда вы говорите поместить ключ в index как location, вы имеете в виду, что фактическое значение, как в моем случае Index, будет {10808 => 0}. Чтобы значение местоположения указывало на индекс в базовом массиве?
Верно :). {10808 => 0, 10809 => 1}
Ах, имеет смысл, большое спасибо за помощь!
С самого начала вам нужно изложить словами, для чего предназначен ваш код. Это как-то связано с объединением хешей, имеющих общий ключ, но этого недостаточно. Вы заставляете читателей пытаться выяснить вашу цель из вашего кода, что, если и отталкивает, и это, несомненно, является причиной, по которой на сегодняшний день не было опубликовано никаких ответов. Кроме того, поскольку ссылки имеют тенденцию к разрыву со временем, как правило, не рекомендуется использовать их (например, «Выполнить фрагмент кода»), как вы. Вместо этого просто покажите возвращаемое значение для каждой строки примера. Если читатели хотят скопировать ваш код, они могут просто вырезать и вставить.
Спасибо за отзыв, я обязательно сделаю это в будущем



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