2015-10-11 5 views
1

У меня есть хэш:Обновление массива хэш-значение из другого массива

{ 
    "grey" => ["anf_94748_01_prod1", "anf_94748_01_model1", "anf_94748_01_model2"], 
    "heather blue" => ["anf_106537_01_prod1", "anf_106537_01_model1", "anf_106537_01_model2"], 
    "indigo" => [], 
    "dark grey" => ["anf_94747_01_prod1"] 
} 

Как я могу заменить его значения в соответствии с массивом идентификаторов изображения:

[317, 318, 319, 320, 340, 358, 365] 

Если хэш-массив пустой, то пропустите его и перейдите к следующему хеш-ключу и назначьте идентификатор этому изображению. Желаемый результат будет:

{ 
    "grey" => [317, 318, 319], 
    "heather blue" => [320, 340, 358], 
    "indigo" => [], 
    "dark grey" => [365] 
} 
+0

Igor, у меня есть два предложения: 1) отформатируйте свой код, чтобы читатели могли его прочитать, не прокручивая по горизонтали; и 2) присваивать каждому примерному вводу (здесь только один хэш) переменную, чтобы читатели могли ссылаться на эти переменные в комментариях и ответах, не определяя их. Например, 'h = {" gray "=> ...}'. –

ответ

0

reduce хорошая функция для принятия перемещения через структуру данных, в то время как накопление некоторого результата.

imgs = [317, 318, 319, 320, 340, 358, 365] 
input = {"grey"=>["anf_94748_01_prod1", "anf_94748_01_model1", "anf_94748_01_model2"], "heather blue"=>["anf_106537_01_prod1", "anf_106537_01_model1", "anf_106537_01_model2"], "indigo"=>[], "dark grey"=>["anf_94747_01_prod1"]} 

input.reduce({}) { |acc, (k, xs)| acc[k] = imgs.shift(xs.count); acc} 

# => {"grey"=>[317, 318, 319], "heather blue"=>[320, 340, 358], "indigo"=>[], "dark grey"=>[365]} 
+2

Или желательно ['Enumerable # each_with_object'] (http://ruby-doc.org/core/Enumerable.html#method-i-each_with_object), поскольку он точно соответствует вашему описанию в отличие от' Enumerable # reduce'. – cremno

+0

Большое спасибо, он работает! –

3
h = { 
    "grey" => ["anf_94748_01_prod1", "anf_94748_01_model1", "anf_94748_01_model2"], 
    "heather blue" => ["anf_106537_01_prod1", "anf_106537_01_model1", "anf_106537_01_model2"], 
    "indigo" => [], 
    "dark grey" => ["anf_94747_01_prod1"] 
} 
a = [317, 318, 319, 320, 340, 358, 365] 

h.each_value{|v| v.map!{a.shift}} 
# => 
# { 
# "grey"=>[317, 318, 319], 
# "heather blue"=>[320, 340, 358], 
# "indigo"=>[], 
# "dark grey"=>[365] 
# } 
+2

Хорошо. Альтернативно, 'v.replace (a.shift (v.size))'. –

1

Как вариант ответа @ Саввы, если вы не хотите, чтобы мутировать h, например, хэш-Ор, вы можете сделать это:

a = [317, 318, 319, 320, 340, 358, 365] 

h.merge(h) { |_,v| a.shift(v.size) } 
    #=> {"grey"=>[317, 318, 319], "heather blue"=>[320, 340, 358], 
    # "indigo"=>[], "dark grey"=>[365] 

Это использует форму Hash#merge который использует блок для определения значений ключей, присутствующих в обоих хэшах, которые здесь являются всеми ключами.

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