Как объединить хеш - PullRequest
       5

Как объединить хеш

0 голосов
/ 27 августа 2018

Я написал огромный код, похожий на приведенный ниже

 headers, *data_rows = @testCaseSheet
    local = headers.zip(*data_rows)
    local = local[1..-1].map {|dataRow| local[0].zip(dataRow).to_h}
    testCaseHash = {}
    local.each do |value|
      testCaseHash[value["Locator"]] = value.tap {|hs| hs.delete("Locator")}
    end
    @testCaseSheet = []
    p testCaseHash
    [h["Test Name"], testCaseHash],

, который выводит мне это, как показано ниже, теперь мне нужно объединить это действие с каждым тестом, я не знаю, как это сделать.

hash= {"Action"=>{"css=#entityType"=>"Type", "id=idNumber"=>"TypeAndWait", "id=shortName"=>"TypeAndTab", "id=FirstName"=>"TypeTabAndWait", nil=>nil}, 

"Test1"=>{"css=#entityType"=>"Individual", "id=idNumber"=>"2323", "id=shortName"=>"M", "id=FirstName"=>"Abc", "id=lastName"=>"Gg"}, 

"Test2"=>{"css=#entityType"=>"Legal", "id=idNumber"=>"2323", "id=shortName"=>"Z", "id=FirstName"=>"Xyz", "id=lastName"=>"Gg"}}

Теперь я хочу объединить это действие со следующими тестами для примера,

hash= { "Test1"=>{"css=#entityType"=>["Individual","Type"], "id=idNumber"=>["2323","TypeAndWait"], "id=shortName"=>["M","TypeAndTab"], "id=FirstName"=>["Abc","TypeTabAndWait"]}, 

"Test2"=>{"css=#entityType"=>["Legal""Type"], "id=idNumber"=>["2323","TypeAndWait"], "id=shortName"=>["Z","TypeAndTab"], "id=FirstName"=>["Xyz","TypeTabAndWait"]}}

Я не знаю, как объединить это, Кто-нибудь может мне помочь?

Ответы [ 3 ]

0 голосов
/ 27 августа 2018

Если я понимаю, вы хотите что-то вроде этого

hash_1 = {a: "a1", b: "b1", c: "c1"}
hash_2 = {a: "a2", b: "b2", d: "d1"}

p hash_1.merge(hash_2) { |k, v1, v2| v1 = [v1, v2] }
# => {:a=>["a1", "a2"], :b=>["b1", "b2"], :c=>"c1", :d=>"d1"}

Который в вашем случае может быть:

test_1_value = my_hash['Test1'].merge(my_hash['Action']) { |k, v1, v2| v1 = [v1, v2] }

# => {"css=#entityType"=>["Individual", "Type"], "id=idNumber"=>["2323", "TypeAndWait"], "id=shortName"=>["M", "TypeAndTab"], "id=FirstName"=>["Abc", "TypeTabAndWait"], "id=\"lastName"=>"Gg", nil=>nil}

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

Редактировать - собирать комментарии

Удалите ненужные ключи и упрощенный блок слияния:

keys_to_remove = ["id=lastName", "whatever", nil]
test_1_value = my_hash['Test1'].merge(my_hash['Action']) { |k, *vs| vs }.delete_if{ |k, _| keys_to_remove.include? k }
# => {"css=#entityType"=>["Individual", "Type"], "id=idNumber"=>["2323", "TypeAndWait"], "id=shortName"=>["M", "TypeAndTab"], "id=FirstName"=>["Abc", "TypeTabAndWait"]}
0 голосов
/ 27 августа 2018

Я хочу остановиться на iGians answer . Хотя в ответе описывается, как решить эту проблему, в нем не использовалась итерация. Вы можете перебрать тесты следующим образом:

hash = {
  "Action"=>{"css=#entityType"=>"Type", "id=idNumber"=>"TypeAndWait", "id=shortName"=>"TypeAndTab", "id=FirstName"=>"TypeTabAndWait", nil=>nil}, 
  "Test1"=>{"css=#entityType"=>"Individual", "id=idNumber"=>"2323", "id=shortName"=>"M", "id=FirstName"=>"Abc", "id=lastName"=>"Gg"}, 
  "Test2"=>{"css=#entityType"=>"Legal", "id=idNumber"=>"2323", "id=shortName"=>"Z", "id=FirstName"=>"Xyz", "id=lastName"=>"Gg"},
}

action = hash.delete 'Action'
tests = hash

tests.each_value do |test|
  action_with_test_keys = action.select { |key, _value| test.key? key }
  test.merge!(action_with_test_keys) { |_key, *values| values } # values = [old, new]
end

Предполагается, что 'Action' является единственным не тестовым ключом в хэше, а все остальные значения должны быть объединены со значением 'Action'. Имейте в виду, что этот подход изменяет переменную hash. Если вы не хотите этого, вы должны просто #dup заранее хешировать или искать подход без мутаций.

Оптимизация

Если вы используете Ruby 2.5.0 или выше, вы можете использовать #slice вместо #select.

action.select { |key, _value| test.key? key }
# is replaced with
action.slice(*test.keys)

Если вы на 100% уверены, что каждый test в tests содержит одинаковые ключи и всегда присутствует хотя бы один тестовый подарок, вы можете переместить назначение action_with_test_keys из блока #each_value для экономии ресурсов. .

tests = hash # anchor point in the above solution
action_with_test_keys = action.slice(*tests.values.first.keys) # added

Ссылки

  • Hash#delete для удаления ключа 'Action' из переменной hash.
  • Hash#each_value для итерации по каждому значению tests.
  • Hash#select, чтобы выбрать только те клавиши action, которые присутствуют в test.
  • Hash#key? для проверки наличия данного ключа.
  • Hash#merge! для объединения action_with_test_keys и обновления переменной test.
  • Hash#slice замена для Hash#select, если вы используете Ruby 2.5.0 или выше.
0 голосов
/ 27 августа 2018

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

hash = {
    "Action"=>{"css=#entityType"=>"Type", "id=idNumber"=>"TypeAndWait", "id=shortName"=>"TypeAndTab", "id=FirstName"=>"TypeTabAndWait", nil=>nil}, 
    "Test1"=>{"css=#entityType"=>"Individual", "id=idNumber"=>"2323", "id=shortName"=>"M", "id=FirstName"=>"Abc", "id=lastName"=>"Gg"}, 
    "Test2"=>{"css=#entityType"=>"Legal", "id=idNumber"=>"2323", "id=shortName"=>"Z", "id=FirstName"=>"Xyz", "id=lastName"=>"Gg"}
  }

action = hash['Action']
tests = hash.reject { |k, v| k == 'Action' }


mapping = tests.map do |name, test|
  groups = (action.to_a + test.to_a).group_by(&:first)
  no_keys = groups.map { |k, v| [k, v.each(&:shift).flatten] }
  no_keys.reject! { |k, v| v.length == 1 }
  [name, Hash[no_keys]]
end

Hash[mapping]
#  => {"Test1"=>{"css=#entityType"=>["Type", "Individual"], "id=idNumber"=>["TypeAndWait", "2323"], "id=shortName"=>["TypeAndTab", "M"], "id=FirstName"=>["TypeTabAndWait", "Abc"]},
#      "Test2"=>{"css=#entityType"=>["Type", "Legal"], "id=idNumber"=>["TypeAndWait", "2323"], "id=shortName"=>["TypeAndTab", "Z"], "id=FirstName"=>["TypeTabAndWait", "Xyz"]}}

Надеюсь, вы найдете это полезным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...