2016-05-02 3 views
-6

Возможно ли получить пересечение массива и только ключи хеша?пересечение рубинового массива и ключей хеша

Я знаю, что оператор & возвращает пересечение двух массивов, но я бы хотел использовать значения вместо комбинации value + key.

Скажем, у меня есть массив и хэш:

a1 = [ 'test1', 'test2', 'test3' ] 
a2 = { 'test3' => 'value3', 'test4'=>'value4', 'test5'=>'value5' } 

есть способ вернуть value3 из них?

+4

Второй недействительный синтаксис. Я предполагаю, что второй должен быть хешем, но вы должны уточнить свой вопрос. – ndn

+1

Пьер, я взял на себя смелость представить редактирование на ваш вопрос, чтобы он четко просил пересечение массива и значения хэша. Раньше вы проходили голосование по двум причинам: 1) ваш вопрос подразумевал, что хеш был массивом, и использовал синтаксис массива для определения хэша, который выдавал бы ошибку, и 2) ваш ожидаемый результат фактически дал бы пересечение ключей вашего хэша и массива, когда кажется, что вы хотите сравнить хэш-значения с массивом. – emery

+0

Непонятно из вашего примера, если вы хотите совместить ключи или значения. – tadman

ответ

2

дал

arr = ['value1', 'value2', 'value3'] 
hsh = {:key1 => 'value3', :key2=>'value4', :key3=>'value5'} 

вы можете конвертировать HSH в массив значений с помощью метода .values ​​и использовать оператор & для сравнения значений хэша с массивом.

arr & hsh.values 

=> ["value3"] 
+0

Yay! Это трюк. Большое спасибо ! –

+0

@PierreOliverTran Нет проблем. Попытайтесь изменить свой вопрос более внимательно в следующий раз, и вы не получите так много downvotes;) – emery

0

a1.reduce(nil) {|r, k| r || a2[k]} должен делать то, что вы просите.

1

Это, вероятно, самый интуитивный способ, которым я могу думать, чтобы делать то, что вы спрашиваете:

a1 = [ 'test1', 'test2', 'test3' ] 
a2 = { 'test3' => 'value3', 'test4'=>'value4', 'test5'=>'value5' } 

(a1 & a2.keys).map { |e| a2[e] } 
#=> ["value3"] 

# or 

a1.select { |e| a2[e] } 
#=> ["value3"] 

То есть вы хотите, пересечение a1 и ключи от a2. Затем вы можете использовать карту для выполнения поиска по каждому найденному на перекрестке ключам, чтобы вернуть значение.

Смежные вопросы