Добавлять значения к существующему (хэш) ключу без перезаписи существующих значений - PullRequest
1 голос
/ 15 марта 2012

Упрощенная версия:

ar=['name: Joe', 'name: Jack', 'name: Jill']

hash={}

ar.each{|line| if line.include?('name'); hash['name'] = line;end;}

puts hash

Моя цель - добавить все элементы в массиве к ключу 'name', но мой код, похоже, перезаписывает существующее значение.

Возможно ли назначить несколько значений одной клавише? Я бы предпочел не использовать массив в качестве значения.

Edit:

Я понял, что мой первый пример не охватывает всю проблему:

расширить массив до: ar = ['имя: Джо', 'имя: Джек', 'имя: Джилл', возраст: 29 ',' возраст: 32 ',' разное: отличная погода ']

Я бы хотел, чтобы имя было сгруппировано под ключом «имя» и т. Д.

Количество атрибутов / ключей заранее неизвестно, поэтому массивы будут иметь верхнюю динамическую составляющую.

1 Ответ

3 голосов
/ 15 марта 2012

Нет никакой опции, кроме использования массива в качестве значения.Иначе как бы вы получили несколько значений?В любом случае вам понадобится какое-нибудь перечислимое, поэтому нет проблем с использованием массива.

Попробуйте что-то вроде этого:

hash = {}
ar = ['name: Joe', 'name: Jack', 'name: Jill']

hash['name'] = ar.select {|l| l.include? 'name'}.collect {|l| l.split.last}

hash # => {"name"=>["Joe", "Jack", "Jill"]}

Или, попросту:1007 *


Для вашего отредактированного вопроса:

hash = Hash.new {|h,k| h[k] = [] }
ar.each {|l| k,v = l.split(": "); hash[k] << v }
hash # => {"name"=>["Joe", "Jack", "Jill"], "foo"=>["bar"]}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...