루비에서 중복 키를 덮어쓰지 않고 두 개의 해시를 병합하려면 어떻게 해야 합니까?
중복 키를 덮어쓰지 않고 두 개의 해시를 병합하는 쉽고 우아한 방법이 있습니까?
즉, 키가 원래 해시에 있는 경우 값을 변경하지 않습니다.
두 개의 해시가 있다면,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
'it-source' 카테고리의 다른 글
ASP.NET: HTTP 오류 500.19 – 내부 서버 오류 0x8007000d (0) | 2023.06.06 |
---|---|
PSQL 명령을 사용하여 호스트 이름 및 포트 찾기 (0) | 2023.06.05 |
"꺼짐" 상태에서 UIS 스위치 색상 변경 (0) | 2023.06.05 |
postgre의 기존 테이블에 대해 "create table" sql 문을 생성하는 방법SQL (0) | 2023.06.05 |
"PageAdapter:: notifyDataSetChanged"가 보기를 업데이트하지 않는 이유는 무엇입니까? (0) | 2023.06.05 |