合并三个哈希并获取此哈希值

时间:2018-09-08 05:59:21

标签: ruby

我已经阅读了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'}]

我的Thrash哈希

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 :(得分:1)

您所说的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

答案 1 :(得分:1)

我们给了三个数组,我将它们分别重命名为arr1arr2arr3。 ({hash1hash2hash3并不是数组的好名字。:-))

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"]}}}