it-source

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

criticalcode 2023. 6. 5. 23:59
반응형

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

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

즉, 키가 원래 해시에 있는 경우 값을 변경하지 않습니다.

두 개의 해시가 있다면,options그리고.defaults그리고 당신은 합병하기를 원합니다.defaults안으로options기존 키를 덮어쓰지 않고 정말로 하고 싶은 것은 그 반대입니다. 병합options안으로defaults:

options = defaults.merge(options)

또는 레일즈를 사용하는 경우 다음 작업을 수행할 수 있습니다.

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-origined-whating"이라는 키가 없다고 가정합니다. 이미 hash1에 없는 키를 누를 때까지 키1, 키2 등이 되도록 키에 숫자를 추가하는 것이 더 나을 수 있습니다.또한, 저는 몇 달 동안 루비를 전혀 하지 않았기 때문에 구문적으로 정확하지 않을 수도 있지만, 요점을 파악할 수 있을 것입니다.

또는 hash1[key]이 hash1의 원래 값과 hash2의 값을 반환하도록 키의 값을 배열로 재정의합니다.당신이 원하는 결과가 무엇인지에 따라 다릅니다.

여기서 2개의 해시를 다음과 같이 병합할 수 있습니다.reverse_merge

order = {
 id: 33987,
 platform: 'web'
}

user = {
  name: 'Jhon Doe',
  email: 'jhon.doe@gmail.com' 
}
newHash = order.reverse_merge!(user)
render json: { data: newHash, status: 200 }

# => {:name=>"Jhon Doe", :email=>"jhon.doe@gmail.com", :id=>33987, :platform=>"web"}

두 해시를 병합하려는 경우options그리고.defaults대상 해시를 덮어쓰지 않고 다음을 통해 확인할 수 있습니다.select키가 대상 해시에 이미 있는 경우.Rails가 없는 순수한 Ruby 솔루션은 다음과 같습니다.

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? })

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

반응형