Вы действительно имеете в виду массивы (например: ['a', 'b', 'c']) или хеши (например: {'a' => 1, 'b' => 2, 'c' => 3}) ?
Alex Reisner
Извините, я говорил о
хешах
Ответы:
236
Если у вас есть два хэша, optionsи defaults, и вы хотите объединить defaultsих optionsбез перезаписи существующих ключей, то на самом деле вы хотите сделать обратное: объединить optionsв defaults:
Если ваша проблема заключается в том, что исходный хэш и второй могут иметь повторяющиеся ключи, и вы не хотите перезаписывать в любом направлении, вам может потребоваться простое ручное слияние с какой-то проверкой и обработкой коллизий:
Очевидно, это очень примитивно и предполагает, что hash1 не имеет никаких ключей с именем «hash2-originated-something» - вам может быть лучше просто добавить число к ключу, чтобы он стал key1, key2 и так далее, пока вы не нажмете тот, которого еще нет в hash1. Кроме того, я не использовал Ruby в течение нескольких месяцев, так что это, вероятно, синтаксически неверно, но вы должны быть в состоянии понять суть.
В качестве альтернативы переопределите значение ключа как массив, чтобы hash1 [key] возвращал исходное значение из hash1 и значение из hash2. Зависит от того, каким вы хотите добиться результата.
Как насчет того, чтобы не сохранить оба ключа, а сложить значения одного и того же ключа?
Tom KC Chiu
1
@ TomK.C.Chiu Это будет во многом зависеть от обстоятельств, о которых мы не можем судить по вопросу - что, если значения в hash1 являются строками, а hash2 - целыми числами? В некоторых случаях это может быть жизнеспособным вариантом, но чаще вызывает проблемы - предложение использовать списки для значений работает довольно чисто.
glenatron
0
Здесь вы можете объединить свои 2 хэша reverse_merge
Если вы хотите , чтобы объединить два хэшей optionsи defaultsбез перезаписи хэша назначения, вы можете проверить с , selectесли ключ уже присутствует в хэш назначения. Вот чистое решение Ruby без Rails:
Ответы:
Если у вас есть два хэша,
options
иdefaults
, и вы хотите объединитьdefaults
ихoptions
без перезаписи существующих ключей, то на самом деле вы хотите сделать обратное: объединитьoptions
вdefaults
:Или, если вы используете Rails, вы можете:
источник
reverse_merge!
из-за проблем с безопасностью в rails 5.1В стандартной библиотеке Ruby есть способ объединить хэши без перезаписи существующих значений или переназначения хэша.
important_hash.merge!(defaults) { |key, important, default| important }
источник
Если ваша проблема заключается в том, что исходный хэш и второй могут иметь повторяющиеся ключи, и вы не хотите перезаписывать в любом направлении, вам может потребоваться простое ручное слияние с какой-то проверкой и обработкой коллизий:
hash2.each_key do |key| if ( hash1.has_key?(key) ) hash1[ "hash2-originated-#{key}" ] = hash2[key] else hash1[key]=hash2[key] end end
Очевидно, это очень примитивно и предполагает, что hash1 не имеет никаких ключей с именем «hash2-originated-something» - вам может быть лучше просто добавить число к ключу, чтобы он стал key1, key2 и так далее, пока вы не нажмете тот, которого еще нет в hash1. Кроме того, я не использовал Ruby в течение нескольких месяцев, так что это, вероятно, синтаксически неверно, но вы должны быть в состоянии понять суть.
В качестве альтернативы переопределите значение ключа как массив, чтобы hash1 [key] возвращал исходное значение из hash1 и значение из hash2. Зависит от того, каким вы хотите добиться результата.
источник
Здесь вы можете объединить свои 2 хэша
reverse_merge
order = { id: 33987, platform: 'web' } user = { name: 'Jhon Doe', email: 'jhon.doe@gmail.com' } newHash = oder.reverse_merge!(user) render json: { data: newHash, status: 200 }
источник
Если вы хотите , чтобы объединить два хэшей
options
иdefaults
без перезаписи хэша назначения, вы можете проверить с ,select
если ключ уже присутствует в хэш назначения. Вот чистое решение Ruby без Rails:options = { "a" => 100, "b" => 200 } defaults = { "b" => 254, "c" => 300 } options.merge!(defaults.select{ |k,_| not options.has_key? k }) # output # => {"a"=>100, "b"=>200, "c"=>300}
Или, если ключ присутствует, но содержит
nil
и вы хотите его перезаписать:options.merge!(defaults.select{ |k,_| options[k].nil? })
источник