Более эффективное решение для поиска дублирующихся объектов или массивов в Javascript?

1

Я знаю, что могу реализовать такое решение, как следующее: Удалить дублирующиеся объекты из массива с помощью javascript, то есть конкатенации элементов, выводящих строку.

Однако, поскольку мой объект (или массив), представляющий сетевой поток, должен содержать 4 или более элементов (то есть Source IP, Destination IP, Source Port, Destination Port) в разных позициях, конкатенация здесь не помогает, так как я должен создать 4 перестановки -строки, чтобы сравнить их. Поэтому я пытаюсь понять, существует ли более эффективное решение.

Предположим, что в javascript есть следующие 4 объекта:

1. { srcip: 192.168.1.10, dstip: 192.168.1.20, srcport: 5000, dstport: 443 }
2. { srcip: 192.168.1.20, dstip: 192.168.1.10, srcport: 443, dstport: 5000 }
3. { srcip: 192.168.1.10, dstip: 192.168.1.20, srcport: 5000, dstport: 80 }
4. { srcip: 192.168.1.30, dstip: 192.168.1.20, srcport: 5000, dstport: 443 }

только объекты 1 и 2 дублируются; другими словами, объекты дублируются, когда все их элементы идентичны, даже если они меняются местами (исходный IP с целевым IP-адресом и исходным портом с портом назначения). Конечно, одни и те же данные могут храниться в массиве, неважно.

1. [192.168.1.10, 192.168.1.20, 5000, 443]
2. [192.168.1.20, 192.168.1.10, 443, 5000]
3. [192.168.1.10, 192.168.1.20, 5000, 80]
4. [192.168.1.30, 192.168.1.20, 5000, 443]

У вас есть идеи, как решить эту проблему?

ОБНОВИТЬ

Читая ваши комментарии и решения, я просто хочу добавить пояснения. Объект должен быть равен другому, если две пары "IP/ports" идентичны, даже если они переключаются. Таким образом, как описано выше, поток 1 и 2 должен быть равен, но следующий поток отличается:

{ srcip: 192.168.1.20, dstip: 192.168.1.10, srcport: 5000, dstport: 443 }

поскольку только его IP-адреса переключаются (но не порты) относительно потока 1.

  • 0
    Четыре перестановки? Если ip остается тем же, но вы переключаете порты, он все еще дублируется? Ex. { srcip: 192.168.1.10, dstip: 192.168.1.20, srcport: 443, dstport: 5000 } также является дубликатом 1 и 2?
  • 0
    Сравнение объектов всегда деликатно в JS. Смотрите также эту тему . Похоже, у Lodash есть _.isEqual() функция _.isEqual() .
Показать ещё 2 комментария
Теги:
object
arrays
permutation
duplicates

2 ответа

1
Лучший ответ

Сначала нужно создать строки, как "{внутрибрюшинно}: {порт}" (или использовать любой другой разделитель, чем :), а затем отсортировать их и присоединиться, чтобы получить одну строку

var arr = [{ srcip: "192.168.1.10", dstip: "192.168.1.20", srcport: 5000, dstport: 443 },
 { srcip: "192.168.1.20", dstip: "192.168.1.10", srcport: 443, dstport: 5000 },
 { srcip: "192.168.1.10", dstip: "192.168.1.20", srcport: 5000, dstport: 80 },
 { srcip: "192.168.1.30", dstip: "192.168.1.20", srcport: 5000, dstport: 443 }
 ]
 
 var arrForRemovingDupes = arr.map(el => [el.srcip + ":" +el.srcport, el.dstip + ":" +el.dstport].sort().join())
 
 console.log(arrForRemovingDupes)
  • 0
    Спасибо, ваше решение может быть хорошим методом. Давайте подождем некоторое время, чтобы увидеть, существуют ли другие решения ... в противном случае я приму ваше! :)
0

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

const data = [
  ['192.168.1.10', '192.168.1.20', 5000, 443],
  ['192.168.1.20', '192.168.1.10', 443, 5000],
  ['192.168.1.10', '192.168.1.20', 5000, 80],
  ['192.168.1.30', '192.168.1.20', 5000, 443],
]

const keys = data.map(item => item.sort().join());

Выход:

[
  "192.168.1.10,192.168.1.20,443,5000",
  "192.168.1.10,192.168.1.20,443,5000", // equals to the previous one
  "192.168.1.10,192.168.1.20,5000,80",
  "192.168.1.20,192.168.1.30,443,5000"
]

Если вы хотите сгруппировать их с исходными объектами, попробуйте;

const grouped = data.reduce((acc, item) => {
  const key = item.sort().join();
  acc[key] = (acc[key] || []).concat([item]);
  return acc;
}, {});
  • 0
    Спасибо за ваше решение @hsz, но это может произойти и в этом потоке (извините, если я не включил в свой исходный пример): ['192.168.1.20', '192.168.1.10', 5000, 443] . Таким образом, этот поток не должен быть равен потоку 1 и 2.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню