programing

두 배열을 해시로 결합

nasanasas 2021. 1. 5. 08:10
반응형

두 배열을 해시로 결합


두 개의 배열이 있습니다.

members     = ["Matt Anderson", "Justin Biltonen", "Jordan Luff", "Jeremy London"]
instruments = ["guitar, vocals", "guitar", "bass", "drums"]

내가하고 싶은 것은 결과 데이터 구조가 다음과 같은 해시가되도록 결합하는 것입니다.

{"Matt Anderson"=>["guitar", "vocals"], "Justin Biltonen"=>"guitar", "Jordan Luff"=>"bass", "Jeremy London"=>"drums"}

"Matt Anderson"의 값은 이제 문자열 대신 배열입니다. 루비 마법사가이 기회를 주려고하나요?

나는 거의 내가 원하는 방식으로 Hash[*members.zip(instruments).flatten]그것들을 결합 한다는 것을 알고있다 . 그러나 먼저 "기타, 보컬"문자열을 배열로 바꾸는 것은 어떨까? 감사.


사용 map하고 split배열로 악기 문자열을 변환 :

instruments.map {|i| i.include?(',') ? (i.split /, /) : i}

그리고 사용 Hash[]zip결합 members하여 instruments:

Hash[members.zip(instruments.map {|i| i.include?(',') ? (i.split /, /) : i})]

얻기 위해

{"Jeremy London"=>"drums",
 "Matt Anderson"=>["guitar", "vocals"],
 "Jordan Luff"=>"bass",
 "Justin Biltonen"=>"guitar"}

단일 항목 목록도 배열인지 상관하지 않는 경우 다음과 같은 간단한 솔루션을 사용할 수 있습니다.

Hash[members.zip(instruments.map {|i| i.split /, /})]

이것은 당신에게 이것을 준다 :

{"Jeremy London"=>["drums"],
 "Matt Anderson"=>["guitar", "vocals"],
 "Jordan Luff"=>["bass"],
 "Justin Biltonen"=>["guitar"]}

Rafe Kettler가 게시했듯이 zip을 사용하는 것이 좋습니다.

Hash[members.zip(instruments)] 

예 01

k = ['a', 'b', 'c']
v = ['aa', 'bb']
h = {}

k.zip(v) { |a,b| h[a.to_sym] = b } 
# => nil

p h 
# => {:a=>"aa", :b=>"bb", :c=>nil}

예제 02

k = ['a', 'b', 'c']
v = ['aa', 'bb', ['aaa','bbb']]
h = {}

k.zip(v) { |a,b| h[a.to_sym] = b }
p h 
# => {:a=>"aa", :b=>"bb", :c=>["aaa", "bbb"]}

이것은 당신이 원하는 것을 할 수있는 가장 좋고 깨끗한 방법입니다.

Hash[members.zip(instruments.map{|i| i.include?(',') ? i.split(',') : i})]

즐겨!


h = {}
members.each_with_index do |el,ix|
    h[el] = instruments[ix].include?(",") ? instruments[ix].split(",").to_a : instruments[ix]
end
h

members.inject({}) { |m, e| t = instruments.delete_at(0).split(','); m[e] = t.size > 1 ? t : t[0]; m }

결과에서 요소가 1 개인 배열에 관심이 없다면 다음을 사용할 수 있습니다.

members.inject({}) { |m, e| m[e] = instruments.delete_at(0).split(','); m }

h = {}

members.each_with_index {|item, index|
     h.store(item,instruments[index].split)
}

참조 URL : https://stackoverflow.com/questions/5174913/combine-two-arrays-into-hash

반응형