해시 값을 변경하는 방법?
각각을 교체하고 싶습니다.value
와 충돌하여value.some_method
.
예를 들어, 단순 해시의 경우:
{"a" => "b", "c" => "d"}`
모든 가치는 다음과 같아야 합니다..upcase
d, 그래서 다음과 같이 보입니다.
{"a" => "B", "c" => "D"}
나는 노력했다.#collect
그리고.#map
항상 어레이만 다시 가져옵니다.이것을 하는 우아한 방법이 있습니까?
갱신하다
젠장, 깜빡했네요.해시가 변경할 수 없는 인스턴스 변수에 있습니다.값이 변경된 새 해시가 필요하지만 변수를 명시적으로 정의한 다음 해시 채우기를 반복하지는 않습니다.다음과 같은 것:
new_hash = hash.magic{ ... }
my_hash.each { |k, v| my_hash[k] = v.upcase }
또는 비파괴적으로 수행하고 수정하는 대신 새 해시를 반환하려면my_hash
:
a_new_hash = my_hash.inject({}) { |h, (k, v)| h[k] = v.upcase; h }
이 마지막 버전에는 키를 변환할 수 있다는 추가적인 이점이 있습니다.
기본 방법을 사용할 수 있으므로 다음을 수행합니다.
hash = {"a" => "b", "c" => "d"}
new_hash = hash.transform_values(&:upcase)
# => {"a" => "B", "c" => "D"}
파괴적인 버전도 있습니다.
값을 수집하고 어레이에서 해시로 다시 변환할 수 있습니다.
다음과 같이:
config = Hash[ config.collect {|k,v| [k, v.upcase] } ]
이렇게 하면 됩니다.
my_hash.each_with_object({}) { |(key, value), hash| hash[key] = value.upcase }
와는 반대로inject
이점은 블록 내에서 해시를 다시 반환할 필요가 없다는 것입니다.
ActiveSupport v4.2.0에는 이를 위한 방법이 있습니다.호출되며 기본적으로 각 키-값 쌍에 대해 블록을 실행합니다.
그들이 그것을 하고 있기 때문에.each
제 생각에 통과하는 것보다 더 좋은 방법은 없을 것 같습니다.
hash = {sample: 'gach'}
result = {}
hash.each do |key, value|
result[key] = do_stuff(value)
end
업데이트:
Ruby 2.4.0부터 및 를 기본적으로 사용할 수 있습니다.
다음 기능을 사용해 보십시오.
h = {"a" => "b", "c" => "d"}
h.each{|i,j| j.upcase!} # now contains {"a" => "B", "c" => "D"}.
한 단계 더 나아가 중첩된 해시에 대해 이 작업을 수행할 수 있습니다.확실히 레일즈 프로젝트에서는 상당한 양의 일이 일어납니다.
다음은 매개 변수 해시가 UTF-8에 있는지 확인하는 몇 가지 코드입니다.
def convert_hash hash
hash.inject({}) do |h,(k,v)|
if v.kind_of? String
h[k] = to_utf8(v)
else
h[k] = convert_hash(v)
end
h
end
end
# Iconv UTF-8 helper
# Converts strings into valid UTF-8
#
# @param [String] untrusted_string the string to convert to UTF-8
# @return [String] your string in UTF-8
def to_utf8 untrusted_string=""
ic = Iconv.new('UTF-8//IGNORE', 'UTF-8')
ic.iconv(untrusted_string + ' ')[0..-2]
end
저는 다음과 같은 일을 합니다.
new_value = Hash[*original_hash.collect{|key,value| [key,value + 1].message]
이를 통해 어떤 식으로든 키 또는 값을 변환할 수 있습니다(물론 파괴적이지 않습니다).
루비가 가지고 있는 것은tap
방법(1.8.7, 1.9.3 및 2.1.0)은 이러한 작업에 매우 유용합니다.
original_hash = { :a => 'a', :b => 'b' }
original_hash.clone.tap{ |h| h.each{ |k,v| h[k] = v.upcase } }
# => {:a=>"A", :b=>"B"}
original_hash # => {:a=>"a", :b=>"b"}
레일별
누군가가 전화만 하면 되는 경우to_s
각 값에 대한 방법이며 레일 4.2(다음을 포함)를 사용하지 않습니다.transform_values
메소드 링크), 다음을 수행할 수 있습니다.
original_hash = { :a => 'a', :b => BigDecimal('23.4') }
#=> {:a=>"a", :b=>#<BigDecimal:5c03a00,'0.234E2',18(18)>}
JSON(original_hash.to_json)
#=> {"a"=>"a", "b"=>"23.4"}
참고: 'json' 라이브러리를 사용해야 합니다.
참고 2: 키도 문자열로 변환됩니다.
값이 문자열이라는 것을 알고 있는 경우 사이클 중에 해당 값에 대한 대체 메서드를 호출할 수 있습니다. 이렇게 하면 값이 변경됩니다.
이것은 값이 문자열인 경우에 한정되어 있기 때문에 질문에 완전히 답하지는 않지만, 누군가에게 유용할 수 있다고 생각했습니다.
new_hash = old_hash.merge(old_hash) do |_key, value, _value|
value.upcase
end
# old_hash = {"a" => "b", "c" => "d"}
# new_hash = {"a" => "B", "c" => "D"}
언급URL : https://stackoverflow.com/questions/812541/how-to-change-hash-values
'programing' 카테고리의 다른 글
Postgre에서 날짜로부터 연도와 월을 추출하는 방법to_char() 함수를 사용하지 않는 SQL? (0) | 2023.05.31 |
---|---|
모듈 대신 사용자 양식에 코드를 입력하는 것에 단점이 있습니까? (0) | 2023.05.31 |
추가 업데이트:다음 추적되지 않은 작업 트리 파일은 병합할 때 덮어씁니다. (0) | 2023.05.31 |
@ViewChild와 @ContentChild의 차이점은 무엇입니까? (0) | 2023.05.31 |
What's the PostgreMySQL AUTOINCREMENT와 동일한 SQL 데이터 유형? (0) | 2023.05.31 |