javascript - 如何使 Set 类型变量的对象唯一?
问题描述
我正在研究一个抓取脚本,并发现了 Set 对象,它应该存储唯一的数据并且性能快速。所以我这样尝试
let scrapedMessages = new Set()
scrapedMessages.add({
text,
...(images.length > 0 && {
images,
}),
senderID,
timestamp,
})
但是当查看抓取的数据时,我发现了这些类型的重复数据
{
"text": "Acne Fighting Facial Wash With Jojoba Beads",
"senderID": "361571627329333",
"timestamp": "1613017270619"
},
{
"text": "Acne Fighting Facial Wash With Jojoba Beads",
"senderID": "361571627329333",
"timestamp": "1613017270619"
}
这是否意味着对象集可能不是唯一的,或者我正在做一些错误。我是通过简单的数组来做的。但为了获得更好的性能,改为设置类型。可以实现吗?最佳做法是什么?
我在 Nodejs 上运行 puppeteer 脚本。
解决方案
JS 使用===
运算符将新元素与集合中已经存在的所有其他元素进行比较,并基于此决定添加新元素或忽略它。
问题是,对象是内存地址:
const a = {x: 1};
const b = {x: 1};
const c = a;
console.log(a===b); // false
console.log(a===c); // true
console.log(b===c); // false
所以这里有几件事你可以做:
扩展
Set
类并重写add
方法来比较对象的属性,而不是使用====
.不推荐,但您可以
JSON.stringify(object)
在添加之前简单地使用。
推荐阅读
- qml - Qt QML Settings.hasTouchScreen 返回 false
- youtube - 如何获取用于创建 Google BQ DTS 的 Youtube 频道页面 ID
- spring-boot - 如何使用springboot rest控制器在springfox中映射两个具有不同参数的相同URL?
- swift - SKNode 内的子节点随着快速摇动设备消失,CMMotionManager 应用于移动球
- c# - 在 C# 应用程序中创建时更改默认的 Google Cloud Storage 存储桶区域
- php - Wordpress+WooCommerce:在 Wordpress 之外获取属性
- database - NiFi中PutHBaseRecord行标识符字段名称属性中的多个列名
- java - 如何在 Micronaut 中使用 entitymanager?
- javascript - 动态 JSON 参考 Node.js
- android - 如何单击标记下方的 GoogleMap 多边形?