2015-06-27 6 views
-1

У меня есть хэш:Добавить массивы значений в хэш

h={'key1'=>'value1', 'key2'=>'value2', 'key3'=>'value3'} 

и для каждого ключа, соответствующий массив:

array1=['string1', 'string2'] 
array2=['string3', 'string4'] 
array3=['string5', 'string6'] 

Я хотел бы получить хэш, как это:

h={ 'key1'=>['value1', ['string1', 'string2']], 
    'key2'=>['value2', ['string3', 'string4']], 
    'key3'=>['value3', ['string5', 'string6']] } 
+1

Не могли бы вы поставить здесь свой код и задать точную проблему? –

+0

Я бы просто хотел уточнить. В основном то, что вы хотите сделать, - это добавить содержимое массива к значениям, присвоенным ключу, например: '' key1 '=> [' value1 ', array1] 'или'' key1 '=> {' value1 '=>' array1 '} '? Это поможет нам лучше помочь :) –

+0

Добро пожаловать в Stack Overflow. Пожалуйста, покажите нам, что вы пробовали. Нам проще, и лучше, чтобы мы исправили ваш код, чем нам писать что-то с нуля, и вы модифицируете его в свой старый код. Кроме того, ожидается, что вы покажете нам свою попытку, чтобы мы знали, что вы не просто ловите кого-то, чтобы написать код для вас. Кроме того, ваш 'h' не является хэшем, это фактически массив, состоящий из одного хэша, содержащего пары ключ/значение' key1' ... 'key10'. –

ответ

0
h = { 'key1'=>'value1', 'key2'=>'value2', 'key3'=>'value3' } 
array1 = ["my dog", "has", "fleas"] 
array2 = ["my cat", "has", "9 lives"] 
array3 = ["my pig", "--wait, I don't", "have a pig"] 
array = [array1, array2, array3] 

Есть много способов сделать это. Вот два. Обратите внимание, что все предполагают, что порядок ввода ключей в h сохраняется, что происходит только в том случае, если вы используете Ruby v1.9 +. Более того, тип объекта (здесь массив), который вы добавляете к каждому значению хеша h, не имеет значения. Это же решение применимо, если добавляемые объекты (элементы array) представляют собой любые типы объектов (хеши, строки, символы, экземпляры классов, что угодно).

# 1: Использование Enumerable#zip

h.zip(array).each { |(k,v),a| h[k] = [v,a] } 
h 
    #=> {"key1"=>["value1", ["my dog", "has", "fleas"]], 
    # "key2"=>["value2", ["my cat", "has", "9 lives"]], 
    # "key3"=>["value3", ["my pig", "--wait, I don't", "have a pig"]]} 

# 2: Использование Hash#merge

Этот метод использует форму Hash#merge, который использует хэш для определения значений ключей, которые присутствуют в оба хеша объединяются. Поскольку h сливается с самим собой, блок вызывается для каждого ключа. Если вы хотите изменить h на месте, вместо этого используйте Hash#merge! (aka update).

a = array.dup 
h.merge(h) { |_,v| [v, a.shift] } 
    #=> {"key1"=>["value1", ["my dog", "has", "fleas"]], 
    # "key2"=>["value2", ["my cat", "has", "9 lives"]], 
    # "key3"=>["value3", ["my pig", "--wait, I don't", "have a pig"]]} 
+0

Cary - это юридическая структура ?: 'h = {'nik' => 'ruby', [a, b, c, d], 'mik' => 'python', [f, r, t, y] } ' – Dmytro

+0

Dmytro, нет, это не так, поскольку каждый элемент' h' (разделенный запятыми) должен быть парой ключ-значение (ключ => значение). ['a', 'b', 'c', 'd'] и ['f', 'r', 't', 'y'] не соответствуют этому требованию. h = {'nik' => ['ruby', ['a', 'b', 'c', 'd']], ... нормально. Обратите внимание, что в '[a, b]', 'a' и' b' должны быть переменные или методы, чтобы массив был допустимым объектом. Вот почему я изменил их ранее в этом комментарии на литералы (строки, но я мог бы использовать символы: '[: a,: b, ..'. –

+0

Спасибо, Cary. Изначально я имел два массива 'array1 = [string1. ..string10] 'и' array2 = [string1 ...string10] 'Я создаю хеш (я думаю):' h = Hash [array1.zip array2] ', но позже появились данные как массивы, которые я могу использовать как значение для текущего ключа1 ... key10. – Dmytro

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