Я знаю, что могу реализовать такое решение, как следующее: Удалить дублирующиеся объекты из массива с помощью 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.
Сначала нужно создать строки, как "{внутрибрюшинно}: {порт}" (или использовать любой другой разделитель, чем :
), а затем отсортировать их и присоединиться, чтобы получить одну строку
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)
Имея выше данные, хранящиеся в массивах, вы можете отсортировать эти массивы и присоединиться к созданию строковых ключей. С помощью списка ключей вы можете легко найти дубликаты:
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;
}, {});
['192.168.1.20', '192.168.1.10', 5000, 443]
. Таким образом, этот поток не должен быть равен потоку 1 и 2.
{ srcip: 192.168.1.10, dstip: 192.168.1.20, srcport: 443, dstport: 5000 }
также является дубликатом 1 и 2?_.isEqual()
функция_.isEqual()
.