Объединение трех хешей и получение этого результирующего хеша - PullRequest
0 голосов
/ 08 сентября 2018

Я прочитал xls и сформировал эти три хеша

hash1=[{'name'=>'Firstname',
        'Locator'=>'id=xxx',
        'Action'=>'TypeAndWait'},
       {'name'=>'Password',
        'Locator'=>'id=yyy',
        'Action'=>'TypeAndTab'}]

Второй хэш

hash2=[{'Test Name'=>'Example',
        'TestNumber'=>'Test1'},
       {'Test Name'=>'Example',
        'TestNumber'=>'Test2'}]

Мой Третий Хэш

hash3=[{'name'=>'Firstname',
        'Test1'=>'four',
        'Test2'=>'Five',
        'Test3'=>'Six'},
       {'name'=>'Password',
        'Test1'=>'Vicky',
        'Test2'=>'Sujin',
        'Test3'=>'Sivaram'}]

Теперь мой результирующий хеш

result={"Example"=>
         {"Test1"=>
           {'Firstname'=>
             ["id=xxx","four", "TypeAndWait"],
            'Password'=>
             ["id=yyy","Vicky", "TypeAndTab"]},
          "Test2"=>
           {'Firstname'=>
             ["id=xxx","Five", "TypeAndWait"],
            'Password'=>
             ["id=yyy","Sujin", "TypeAndTab"]}}}

Я получил этот результат, но мне пришлось написать 60 строк кода в моей программе, но я не думаю, что мне нужно писать такую ​​длинную программу, когда я использую Ruby, я твердо верю, что есть простой способ добиться этого , Кто-нибудь может мне помочь?

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

Ответы [ 2 ]

0 голосов
/ 08 сентября 2018

Нам даны три массива, которые я переименовал в arr1, arr2 и arr3. (hash1, hash2 и hash3 не особенно хорошие имена для массивов.: -))

arr1 = [{'name'=>'Firstname', 'Locator'=>'id=xxx', 'Action'=>'TypeAndWait'},
        {'name'=>'Password', 'Locator'=>'id=yyy', 'Action'=>'TypeAndTab'}]

arr2 = [{'Test Name'=>'Example', 'TestNumber'=>'Test1'},
        {'Test Name'=>'Example', 'TestNumber'=>'Test2'}]

arr3=[{'name'=>'Firstname', 'Test1'=>'four', 'Test2'=>'Five', 'Test3'=>'Six'},
      {'name'=>'Password', 'Test1'=>'Vicky', 'Test2'=>'Sujin', 'Test3'=>'Sivaram'}]

Драйверами являются значения "Test1" и "Test2" в хешах, которые являются элементами arr2. Больше ничего в этом массиве не требуется, поэтому давайте извлечем те значения (из которых может быть любое число, но здесь их всего два).

a2 = arr2.map { |h| h['TestNumber'] }
  #=> ["Test1", "Test2"]

Далее нам нужно изменить информацию в arr3, создав хеш, ключи которого являются элементами a2.

h3 = a2.each_with_object({}) { |test,h|
  h[test] = arr3.each_with_object({}) { |f,g| g[f['name']] = f[test] } }
  #=> {"Test1"=>{"Firstname"=>"four", "Password"=>"Vicky"},
  #    "Test2"=>{"Firstname"=>"Five", "Password"=>"Sujin"}}

Далее нам нужно переставить содержимое arr1, создав хеш, ключи которого соответствуют ключам значений h3.

h1 = arr1.each_with_object({}) { |g,h| h[g['name']] = g.reject { |k,_| k == 'name' } }
  #=> {"Firstname"=>{"Locator"=>"id=xxx", "Action"=>"TypeAndWait"}, 
  #    "Password"=>{"Locator"=>"id=yyy", "Action"=>"TypeAndTab"}}

Теперь просто извлечь информацию из этих трех объектов.

{ 'Example'=>
  a2.each_with_object({}) do |test,h|
    h[test] = h3[test].each_with_object({}) do |(k,v),g|
      f = h1[k]
      g[k] = [f['Locator'], v, f['Action']]
    end
  end
}
  #=> {"Example"=>
  #     {"Test1"=>{"Firstname"=>["id=xxx", "four", "TypeAndWait"],
  #                "Password"=>["id=yyy", "Vicky", "TypeAndTab"]},
  #      "Test2"=>{"Firstname"=>["id=xxx", "Five", "TypeAndWait"],
  #                "Password"=>["id=yyy", "Sujin", "TypeAndTab"]}}}
0 голосов
/ 08 сентября 2018

То, что вы называете hash{1-2-3}, - это в первую очередь массивы. Кроме того, я почти уверен, что вы ошиблись hash1#Locator и / или hash3#name. Приведенный ниже код работает для этих точных данных, но его не должно быть сложно обновить, чтобы отразить любые изменения.

hash2.
  map(&:values).
  group_by(&:shift).
  map do |k, v|
    [k, v.flatten.map do |k, v|
          [k, hash3.map do |h3|
                # lookup a hash from hash1
                h1 = hash1.find do |h1|
                   h3['name'].start_with?(h1['Locator'])
                end
                # can it be nil btw?
                [
                  h1['name'],
                  [
                    h3['name'][/.*(?=-id)/],
                    h3[k],
                    h1['Action']
                  ]
                ]
          end.to_h]
    end.to_h]
  end.to_h
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...