배열을 해시 루비로
이 배열 변환:
a = ["item 1", "item 2", "item 3", "item 4"]
...해시로:
{ "item 1" => "item 2", "item 3" => "item 4" }
즉, 짝수 인덱스의 요소는 키이고 홀수 요소는 값입니다.
a = ["item 1", "item 2", "item 3", "item 4"]
h = Hash[*a] # => { "item 1" => "item 2", "item 3" => "item 4" }
바로 그겁니다.그*
를 스플랫 연산자라고 합니다.
@Mike Lewis(댓글에 있는) 한 경고: "이것에 대해 매우 조심하세요.루비가 스택에서 스플랫을 확장합니다.대규모 데이터셋으로 이 작업을 수행할 경우 스택이 폭발할 것으로 예상됩니다."
따라서 대부분의 일반적인 사용 사례에서는 이 방법이 좋지만 많은 데이터에서 변환을 수행하려면 다른 방법을 사용하십시오.예를 들어, @Wukasz Niemier(댓글에도 있음)는 대규모 데이터 세트에 대해 다음과 같은 방법을 제공합니다.
h = Hash[a.each_slice(2).to_a]
Ruby 2.1.0에 도입된 기능은to_h
원래 어레이가 키-값 쌍의 어레이로 구성된 경우 필요한 작업을 수행하는 어레이의 메서드: http://www.ruby-doc.org/core-2.1.0/Array.html#method-i-to_h .
[[:foo, :bar], [1, 2]].to_h
# => {:foo => :bar, 1 => 2}
그냥 사용하기Hash.[]
배열에 있는 값을 사용합니다.예:
arr = [1,2,3,4]
Hash[*arr] #=> gives {1 => 2, 3 => 4}
또는 다음과 같은 항목이 있는 경우[key, value]
어레이, 다음과 같은 기능을 제공:
[[1, 2], [3, 4]].inject({}) do |r, s|
r.merge!({s[0] => s[1]})
end # => { 1 => 2, 3 => 4 }
이것이 제가 이것을 검색할 때 찾고 있던 것입니다.
[{a: 1}, {b: 2}].reduce({}) { |h, v| h.merge v } => {:a=>1, :b=>2}
Enumerator
를 포함합니다.2.1
,Enumerable
방법도 있습니다.그래서, 우리는 쓸 수 있습니다:-
a = ["item 1", "item 2", "item 3", "item 4"]
a.each_slice(2).to_h
# => {"item 1"=>"item 2", "item 3"=>"item 4"}
왜냐하면 차단이 없으면 우리는Enumerator
그리고 위의 설명에 따르면, 우리는 전화를 걸 수 있습니다.#to_h
의 방법Enumerator
물건.
단일 어레이에 대해 이렇게 시도할 수 있습니다.
irb(main):019:0> a = ["item 1", "item 2", "item 3", "item 4"]
=> ["item 1", "item 2", "item 3", "item 4"]
irb(main):020:0> Hash[*a]
=> {"item 1"=>"item 2", "item 3"=>"item 4"}
배열용.
irb(main):022:0> a = [[1, 2], [3, 4]]
=> [[1, 2], [3, 4]]
irb(main):023:0> Hash[*a.flatten]
=> {1=>2, 3=>4}
a = ["item 1", "item 2", "item 3", "item 4"]
Hash[ a.each_slice( 2 ).map { |e| e } ]
아니면, 만약 당신이 싫다면,Hash[ ... ]
:
a.each_slice( 2 ).each_with_object Hash.new do |(k, v), h| h[k] = v end
또는 고장난 기능성 프로그래밍의 게으른 팬일 경우:
h = a.lazy.each_slice( 2 ).tap { |a|
break Hash.new { |h, k| h[k] = a.find { |e, _| e == k }[1] }
}
#=> {}
h["item 1"] #=> "item 2"
h["item 3"] #=> "item 4"
모든 답변은 시작 배열이 고유하다고 가정합니다.OP가 중복 항목이 있는 배열을 처리하는 방법을 지정하지 않아 키가 중복됩니다.
어디 보자꾸나:
a = ["item 1", "item 2", "item 3", "item 4", "item 1", "item 5"]
당신은 패배할 것입니다.item 1 => item 2
재정의된 대로 쌍을 이룹니다. bij로 지정합니다.item 1 => item 5
:
Hash[*a]
=> {"item 1"=>"item 5", "item 3"=>"item 4"}
다음을 포함한 모든 방법.reduce(&:merge!)
결과적으로 동일한 제거가 수행됩니다.
하지만 이것이 바로 당신이 기대하는 것일 수도 있습니다.하지만 다른 경우에는, 아마도 당신은 결과를 얻기를 원할 것입니다.Array
대신 가치에 대해 설명합니다.
{"item 1"=>["item 2", "item 5"], "item 3"=>["item 4"]}
기본값을 가진 해시인 도우미 변수를 만든 다음 루프에 채우는 것이 가장 현명한 방법입니다.
result = Hash.new {|hash, k| hash[k] = [] } # Hash.new with block defines unique defaults.
a.each_slice(2) {|k,v| result[k] << v }
a
=> {"item 1"=>["item 2", "item 5"], "item 3"=>["item 4"]}
사용이 가능할 수 있습니다.assoc
그리고.reduce
위에서 한 줄로 하는 것, 그러나 그것은 추론하고 읽기가 훨씬 어려워집니다.
언급URL : https://stackoverflow.com/questions/4028329/array-to-hash-ruby
'itsource' 카테고리의 다른 글
macOS 업데이트 후 Git가 작동하지 않습니다("xcrun: 오류: 잘못된 활성 개발자 경로(/Library/Developer/CommandLineTools"). (0) | 2023.05.12 |
---|---|
PowerShell로 원격으로 파일 복사 (0) | 2023.05.12 |
Excel 공식에서 상대 위치 사용 (0) | 2023.05.12 |
WPF 텍스트 상자에 이벤트 붙여넣기 (0) | 2023.05.12 |
및/또는 VBA의 기타 기능 (0) | 2023.05.12 |