programing

해시 값을 변경하는 방법?

magicmemo 2023. 5. 31. 15:47
반응형

해시 값을 변경하는 방법?

각각을 교체하고 싶습니다.value와 충돌하여value.some_method.

예를 들어, 단순 해시의 경우:

{"a" => "b", "c" => "d"}` 

모든 가치는 다음과 같아야 합니다..upcased, 그래서 다음과 같이 보입니다.

{"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.32.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

반응형