Удалить вложенный массив по определенному значению дубликата поля - PullRequest
0 голосов
/ 07 февраля 2019

У меня есть:

multy_array = [
  [Jack, Fred, Jane],
  [Paul, Mattew, Gina],
  [Jack, Bart, Hector],
  [Jhon, Veronica, Nicole],
  [Marcella, Vianka, Richard]
]

Я хочу сохранить только один вложенный массив, который представляет уникальный элемент в индексе [0][0] массива, т.е. Jack.Поэтому я должен оставить только первый подмассив с Jack и удалить весь другой суб-массив с индексом [2].Я хочу:

[
  [Jack, Fred, Jane],
  [Paul, Mattew, Gina],
  [Jhon, Veronica, Nicole],
  [Marcella, Vianka, Richard]
]

Ответы [ 2 ]

0 голосов
/ 07 февраля 2019

Другой вариант построения хэша (Enumerable#to_h), где ключи являются уникальными по определению:

multy_array.reverse.map { |e| [e.first, e] }.to_h.values
0 голосов
/ 07 февраля 2019

Если вы хотите удалить массивы, которые содержат элемент first массива first в любой позиции, это будет простой Array#reject, что-тонапример:

multi_array.reject { |arr| arr != multi_array[0] && arr.include?(multi_array[0][0]) }

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

irb(main):001:0> multi_array = [%w[Jack Fred Jane], %w[Paul Matthew Gina], %w[Jack Bart Hector], %w[John Veronica Nicole], %w[Marcella Vianka Richard]]

=> [["Jack", "Fred", "Jane"], ["Paul", "Matthew", "Gina"], ["Jack", "Bart", "Hector"], ["John", "Veronica", "Nicole"], ["Marcella", "Vianka", "Richard"]]

irb(main):016:0> multi_array.reject { |arr| arr != multi_array[0] && arr.include?(multi_array[0][0]) }

=> [["Jack", "Fred", "Jane"], ["Paul", "Matthew", "Gina"], ["John", "Veronica", "Nicole"], ["Marcella", "Vianka", "Richard"]]

РЕДАКТИРОВАТЬ:

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

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

multi_array.each_with_object([]) { |a, result| result << a unless a.any? { |b| result.flatten.include?(b) } }

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

irb(main):004:0> multi_array.each_with_object([]) { |a, result| result << a unless a.any? { |b| result.flatten.include?(b) } }

=> [["Jack", "Fred", "Jane"], ["Paul", "Matthew", "Gina"], ["John", "Veronica", "Nicole"], ["Marcella", "Vianka", "Richard"]]

Здесь я добавляю «Richard» ко второму массиву, и вы можете видеть, что оба «Jack» оба"и второй массив" Ричард "удаляются.

irb(main):009:0> multi_array = [%w[Jack Fred Jane], %w[Paul Matthew Richard], %w[Jack Bart Hector], %w[John Veronica Nic ole], %w[Marcella Vianka Richard]]

=> [["Jack", "Fred", "Jane"], ["Paul", "Matthew", "Richard"], ["Jack", "Bart", "Hector"], ["John", "Veronica", "Nicole"], ["Marcella", "Vianka", "Richard"]]

irb(main):010:0> multi_array.each_with_object([]) { |a, result| result << a unless a.any? { |b| result.flatten.include?(b) } }

=> [["Jack", "Fred", "Jane"], ["Paul", "Matthew", "Richard"], ["John", "Veronica", "Nicole"]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...