IT박스

Ruby에서 중복 키를 덮어 쓰지 않고 두 개의 해시를 병합하려면 어떻게해야합니까?

itboxs 2020. 6. 26. 19:07
반응형

Ruby에서 중복 키를 덮어 쓰지 않고 두 개의 해시를 병합하려면 어떻게해야합니까?


중복 키를 덮어 쓰지 않고 두 개의 해시를 병합 하는 쉽고 우아한 방법이 있습니까?

즉, 키가 원래 해시에 있으면 값을 변경하고 싶지 않습니다.


두 해시를 가지고있는 경우 optionsdefaults,와 병합 할 defaultsoptions병합 : 기존 키를 덮어 쓰지 않고, 당신이 정말로 원하는 것은 반대입니다 options로는 defaults:

options = defaults.merge(options)

또는 Rails를 사용하는 경우 다음을 수행 할 수 있습니다.

options.reverse_merge!(defaults)

표준 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-whatever"라는 키가 없다고 가정합니다. 키에 숫자를 추가하는 것이 더 좋을 수 있으므로 키를 누를 때까지 키 1, 키 2 등이됩니다. 아직 hash1에없는 것. 또한, 나는 몇 달 동안 루비를하지 않았으므로 구문 상으로는 정확하지 않지만 요점을 얻을 수 있어야합니다.

또는 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 }

참고 : https://stackoverflow.com/questions/1980794/how-can-i-merge-two-hashes-without-overwritten-duplicate-keys-in-ruby

반응형