我知道我可以实现如下的解决方案: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被切换(而不是端口)。
发布于 2018-08-06 09:01:01
首先创建像"{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)
发布于 2018-08-03 12:09:35
如果将上述数据存储在数组中,则可以对这些数组进行排序,并将其连接起来创建字符串键。通过一个键列表,您可以很容易地找到重复的键:
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;
}, {});https://stackoverflow.com/questions/51672139
复制相似问题