Ruby исключить указанные c данные из массива хэшей - PullRequest
0 голосов
/ 04 февраля 2020

Я получил ответ, который имеет sh и массив хэшей:

"id"=>67547,
 "description"=>"project",
 "actors"=>
  [
    {"id"=>123,
    "displayName"=>"John Doe",
    "type"=>"atlassian-user-role-actor",
    "name"=>"john.doe",
    "actorUser"=>{"accountId"=>"some_id"}},
   {"id"=>456,
     "displayName"=>"Chris Sth",
     "type"=>"atlassian-user-role-actor",
     "name"=>"chris.sth",
     "actorUser"=>{"accountId"=>"some_id"}},
   {"id"=>789,
     "displayName"=>"Testing Name",
     "type"=>"atlassian-user-role-actor",
     "name"=>"testing.name",
     "actorUser"=>{"accountId"=>"some_id"}},
  ]

Мне нужно получить имя для каждого hash['actors'] и преобразовать его в адрес электронной почты. Дело в том, что мне нужно пропустить имена, которые определены как EXCLUDED_NAMES

EXCLUDED_NAMES = %w[
  chris.sth
  removed1258986304
  john.doe
  other.names
].freeze

private_constant :DEFAULT_EXCLUDED_NAMES

Я пытался что-то вроде ниже, но все же получить все имена:

def setup_email
  dev_role['actors'].map do |user|
    if user.include?(EXCLUDED_NAMES)
      user.delete
    else
      "#{user['name']}@example.com"
    end
  end
end

Ответы [ 4 ]

2 голосов
/ 04 февраля 2020

Вы можете получить массив действительных писем с:

emails = dev_role['actors'].map do |user|
  "#{user['name']}@example.com" unless EXCLUDED_NAMES.include?(user['name'])
end

Массив будет содержать только 'тестирование. name@example.com'

1 голос
/ 04 февраля 2020

Если dev_role['actors'] это:

  [
    {"id"=>123,
    "displayName"=>"John Doe",
    "type"=>"atlassian-user-role-actor",
    "name"=>"john.doe",
    "actorUser"=>{"accountId"=>"some_id"}},
   {"id"=>456,
     "displayName"=>"Chris Sth",
     "type"=>"atlassian-user-role-actor",
     "name"=>"chris.sth",
     "actorUser"=>{"accountId"=>"some_id"}},
   {"id"=>789,
     "displayName"=>"Testing Name",
     "type"=>"atlassian-user-role-actor",
     "name"=>"testing.name",
     "actorUser"=>{"accountId"=>"some_id"}},
  ]

, то наверняка, что user в each блоке будет Hash объект:

{
  "id"=>123,
  "displayName"=>"John Doe",
  "type"=>"atlassian-user-role-actor",
  "name"=>"john.doe",
  "actorUser"=>{"accountId"=>"some_id"}
}

Так Выполнение user["name"] должно привести к: "john.doe".

Теперь, когда у нас есть список исключений EXCLUDED_NAMES, мы можем использовать include? примерно так:

EXCLUDED_NAMES.include?(user["name"])
=> # true if the name is in the EXCLUDED_NAMES

Итак, все, что вам нужно, это небольшое изменение в вашем коде для исправления условия:

def setup_email
  dev_role['actors'].map do |user|
    if EXCLUDED_NAMES.include?(user["name"])
      user.delete
    else
      "#{user['name']}@example.com"
    end
  end
end

Однако есть одна проблема, user.delete не будет работать, так как ожидает аргумент он должен быть ключом к объекту ha sh.

Это можно исправить с помощью reject или select (изменяясь на reject, как читается лучше):

def setup_email
  dev_role['actors'].reject do |user|
    EXCLUDED_NAMES.include?(user["name"])
  end.map{ |user| user["name"] }
end

Природа метода, кажется, возвращает массив / список, поэтому я настаиваю на том, что имя таких методов должно быть во множественном числе: setup_emails.

0 голосов
/ 04 февраля 2020
dev_role=dev_role.to_hash
actors=dev_role["actors"]
for each_actor in actors
    if EXCLUDED_NAMES.include?(each_actor["name"])==false
        p "#{each_actor['name']}@example.com"
    end
end
0 голосов
/ 04 февраля 2020

Я бы создал поиск ha sh на основе имени актера. Затем получите значения, которых нет в EXCLUDED_NAMES.

Когда актеры могут содержать повторяющиеся имена:

actors = dev_role['actors'].group_by { |actor| actor['name'] }
actors = actors.values_at(*actors.keys - EXCLUDED_NAMES).flatten(1)

Когда актеры не могут содержать повторяющиеся имена:

actors = dev_role['actors'].to_h { |actor| [actor['name'], actor] }
actors = actors.values_at(*actors.keys - EXCLUDED_NAMES)

Тогда:

emails = actors.map { |actor| "#{actor['name']}@example.com" }

Вы также можете решить это с помощью комбинации Array#reject / Array#map:

emails = dev_role['actors']
         .reject { |actor| EXCLUDED_NAMES.include?(actor['name']) }
         .map { |actor| "#{actor['name']}@example.com" }

При использовании большого массива EXCLUDED_NAMES приведенное выше может быть медленнее.

...