我知道我可以实现一种类似于以下解决方案的解决方案:Remove duplicate objects from an array using javascript,即输出字符串的项目的串联。
但是,由于代表网络流的我的对象(或数组)必须在不同位置包含4个或更多项(即,源IP,目标IP,源端口,目标端口),因此此处的串联无济于事创建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 /端口”相同,则即使两个对象都已切换,对象也必须彼此相等。因此,如上所述,流程1和2应该相等,但是以下流程是不同的:
{ srcip: 192.168.1.20, dstip: 192.168.1.10, srcport: 5000, dstport: 443 }
因为仅针对流1交换了其IP(但未交换端口)。
答案 0 :(得分:1)
首先创建诸如“ {ip}:{port}” 之类的字符串(或使用:
以外的任何其他分隔符),然后对其进行排序并加入以获得单个字符串
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)
答案 1 :(得分: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;
}, {});