Как не повторять код при зацикливании структуры данных, где значением ключа может быть хеш или массив из нескольких элементов? - PullRequest
0 голосов
/ 25 марта 2019

У меня сложная структура данных, которая выглядит следующим образом:

ds1 =
{
  'item1' =>
  {
    'value' => '1024',
    'flavor' => %w(s m l xl),
    'platform_version' => %w(7),
  },
  'item2' =>
  [{
    'value' => '2000000',
    'flavor' => %w(l xl),
    'platform_version' => %w(7),
  },
  {
    'value' => '1000000',
    'flavor' => %w(s m),
    'platform_version' => %w(6),
  },],
}

В настоящее время я зацикливаюсь на этом следующим образом:

ds1.each do |name, obj|
  if obj.is_a?(Array)
    # Found that the data structure has multiple scenarios for the same key and need to loop over each element
    obj.each do |sub_obj|
      next unless flavor_check?(sub_obj, s_lit, 'flavor') # calls flavor_check? function
      obj_func(name, sub_obj) # call a function here
    end
  else
    # hash only has one element so treat normally, no need for another loop
    next unless flavor_check?(sub_obj, s_lit, 'flavor') # calls flavor_check? function
    obj_func(name, sub_obj) # call a function here
  end
end

Иногда у меня гораздо больше кода, который янеобходимо выполнить и повторить его дважды, в зависимости от того, является ли "obj" массивом или нет, просто делает мой код занятым / уродливым.Есть ли более элегантный способ справиться с этим?

1 Ответ

2 голосов
/ 25 марта 2019

Вы можете просто обернуть его в массив все время:

ds1.each do |name, obj|
  [obj].flatten(1).each do |sub_obj|
    next unless flavor_check?(sub_obj, s_lit, 'flavor') # calls flavor_check? function
    obj_func(name, sub_obj) # call a function here
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...