как преобразовать этот массив в хэш - PullRequest
0 голосов
/ 02 мая 2019

У меня есть массив что-то вроде этого

['project','AAA','Division','BBB','TestingType','CCC','Email','abc@gmail.com','def'@gmail.com','efg@gmail.com',...]

количество писем варьируется.а также что-то может войти внутрь, как 'project','AAA','Time','2323','Division','BBB','TestingType','CCC' Теперь вы, возможно, заметили, что время и 2323 введены, поэтому хэш результата также должен состоять из 'Time' => '2323'.Но электронная почта в любом случае была бы в конце.

Я хочу преобразовать этот массив в хеш, подобный этому

resultHash = {
  'project' => 'AAA',
  'Division' => 'BBB',
  'TestingType' => 'CCC',
  'Email' => ['abc@gmail.com', 'def@gmail.com', 'efg@gmail.com']
}

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

Ответы [ 3 ]

5 голосов
/ 02 мая 2019

Похоже, вы ищете что-то вроде:

attributes, emails = *array.slice_before('Email')
Hash[*attributes].update(emails.first => emails[1..-1])
#=> {"project"=>"AAA", "Division"=>"BBB", "TestingType"=>"CCC", 
#    "Email"=>["abc@gmail.com", "def@gmail.com", "efg@gmail.com"]}
1 голос
/ 02 мая 2019
arr = ['project','AAA','Division','BBB','TestingType','CCC',
       'Email','abc@gmail.com','def@gmail.com','efg@gmail.com']

idx = arr.index('Email')
  #=> 6 
Hash[*arr[0,idx], 'Email', arr[idx+1..-1]]
  #=> {"project"=>"AAA", "Division"=>"BBB", "TestingType"=>"CCC",
  #    "Email"=>["abc@gmail.com", "def@gmail.com", "efg@gmail.com"]} 
1 голос
/ 02 мая 2019

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

ary[ary.index('Email')..].partition{ |e| e == 'Email'}
.then { |k, v| ary[0..ary.index('Email')-1].each_slice(2).to_a << [k.first, v] }.to_h

#=> {"project"=>"AAA", "Division"=>"BBB", "TestingType"=>"CCC", "Email"=>["abc@gmail.com", "def@gmail.com", "efg@gmail.com"]}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...