首页 > 解决方案 > 如何使 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 脚本。

标签: javascriptnode.jsweb-scrapingpuppeteer

解决方案


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

所以这里有几件事你可以做:

  1. 扩展Set类并重写add方法来比较对象的属性,而不是使用====.

  2. 不推荐,但您可以JSON.stringify(object)在添加之前简单地使用。


推荐阅读