Удаление дублирующих элементов массива с фильтрацией в Ruby - PullRequest
0 голосов
/ 02 июля 2018

У меня есть массив предметов:

[
  ["20180629", "14:49", "google", "iOS", "Safari", "1"], 
  ["20180629", "12:22", "google", "Android", "Chrome", "2"],
  ["20180629", "17:20", "google", "iOS", "Safari", "1"], 
  ["20180629", "16:30", "(direct)", "iOS", "Safari", "1"], 
  ["20180629", "09:29", "(direct)", "Android", "Chrome", "2"]
]

Мне нужно удалить дубликаты подмассивов, в которых есть все одинаковые элементы, кроме первых двух (временных кодов). Я сузил свой код до этого:

exclude_from_filter = [0,1]


array.each_with_index.map do |array, index|
  array.reject.with_index { |e,i| exclude_from_filter.include? i }
end.uniq!

, который удаляет временные коды, а затем удаляет повторяющиеся элементы:

[
  ["google", "iOS", "Safari", "1"], 
  ["google", "Android", "Chrome", "2"], 
  ["(direct)", "iOS", "Safari", "1"], 
  ["(direct)", "Android", "Chrome", "2"]
]

Однако вместо этого я хотел бы избавиться от дубликатов, оставив одно уникальное значение без изменений:

[
  ["20180629", "14:49", "google", "iOS", "Safari", "1"], 
  ["20180629", "12:22", "google", "Android", "Chrome", "2"],
  ["20180629", "16:30", "(direct)", "iOS", "Safari", "1"], 
  ["20180629", "09:29", "(direct)", "Android", "Chrome", "2"]
]

И вот где я полностью потерялся

1 Ответ

0 голосов
/ 02 июля 2018

Если вы просто хотите удалить дубликаты на основе последних 4 значений, используйте uniq с блоком:

ary.uniq { |e| e[2..5] }
 => [["20180629", "14:49", "google", "iOS", "Safari", "1"],
     ["20180629", "12:22", "google", "Android", "Chrome", "2"],
     ["20180629", "16:30", "(direct)", "iOS", "Safari", "1"],
     ["20180629", "09:29", "(direct)", "Android", "Chrome", "2"]] 

Или, чтобы удалить их на основе всех значений, кроме первых двух, выполните:

ary.uniq { |e| e[2..-1] }

, которое также можно записать как (предложение Серхио):

ary.uniq { |date, time, *rest| rest }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...