좋아, 여기에 거래가 있습니다. 나는 이것에 대한 해결책을 찾기 위해 여러 해 동안 인터넷 검색을 해왔으며 거기에 많은 사람들이 있지만 그들은 내가 찾고있는 일을하지 않는 것 같습니다.
기본적으로 나는 이런 식으로 배열 된 배열을 가지고 있습니다.
["item 1", "item 2", "item 3", "item 4"]
이것을 해시로 변환하고 싶습니다.
{ "item 1" => "item 2", "item 3" => "item 4" }
즉, ‘짝수’인덱스에있는 항목은 키이고 ‘odd’인덱스에있는 항목은 값입니다.
이것을 깨끗하게하는 방법에 대한 아이디어가 있습니까? 무차별 강제 방법은 모든 짝수 색인을 별도의 배열로 가져온 다음 주위를 반복하여 값을 추가하는 것입니다.
답변
a = ["item 1", "item 2", "item 3", "item 4"]
h = Hash[*a] # => { "item 1" => "item 2", "item 3" => "item 4" }
그게 다야. 이것을 splat 연산자 *
라고합니다 .
@Mike Lewis 당 한 가지주의 사항 (의견에서) : “조심해야합니다. 루비는 스택에서 표시를 확장합니다. 대규모 데이터 세트로이 작업을 수행하는 경우 스택을 제거 할 것으로 예상됩니다.”
따라서 대부분의 일반적인 사용 사례에서이 방법은 훌륭하지만 많은 데이터를 변환하려면 다른 방법을 사용하십시오. 예를 들어, @ Łukasz Niemier (또한 주석에서)는 큰 데이터 세트에이 방법을 제공합니다.
h = Hash[a.each_slice(2).to_a]
답변
Ruby 2.1.0은 to_h
원래 배열이 키-값 쌍의 배열로 구성된 경우 필요한 것을 수행 하는 메소드를 Array에 도입했습니다 . 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
포함 Enumerable
합니다. 이후 2.1
, Enumerable
같은 방법이있다 #to_h
. 그래서 우리는 다음과 같이 쓸 수 있습니다.
a = ["item 1", "item 2", "item 3", "item 4"]
a.each_slice(2).to_h
# => {"item 1"=>"item 2", "item 3"=>"item 4"}
#each_slice
블록이 없으면 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}