首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Javascript中找到重复的对象或数组的更有效的解决方案?

在Javascript中找到重复的对象或数组的更有效的解决方案?
EN

Stack Overflow用户
提问于 2018-08-03 11:58:46
回答 2查看 89关注 0票数 1

我知道我可以实现如下的解决方案:Remove duplicate objects from an array using javascript,即输出字符串的项的连接。

但是,由于表示网络流的对象(或数组)必须在不同的位置包含4个或更多项(即源IP、目标IP、源端口、目标端口),所以在这里连接是没有帮助的,因为我应该创建4个置换字符串来比较它们。所以我想了解是否存在一个更有效的解决方案。

假设javascript中有以下4个对象:

代码语言:javascript
复制
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,源端口与目的端口),对象也是重复的。当然,同样的数据可以存储在数组中,不管是什么。

代码语言:javascript
复制
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应该相等,但以下流不同:

代码语言:javascript
复制
{ srcip: 192.168.1.20, dstip: 192.168.1.10, srcport: 5000, dstport: 443 }

因为对于流程1,只有它的IP被切换(而不是端口)。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-08-06 09:01:01

首先创建像"{ip}:{port}" (或使用:以外的任何分隔符)之类的字符串,然后对它们进行排序并加入以获得单个字符串。

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2018-08-03 12:09:35

如果将上述数据存储在数组中,则可以对这些数组进行排序,并将其连接起来创建字符串键。通过一个键列表,您可以很容易地找到重复的键:

代码语言:javascript
复制
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());

输出:

代码语言:javascript
复制
[
  "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"
]

如果您想要将它们分组为原始对象,请尝试使用;

代码语言:javascript
复制
const grouped = data.reduce((acc, item) => {
  const key = item.sort().join();
  acc[key] = (acc[key] || []).concat([item]);
  return acc;
}, {});
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51672139

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档