Javascript设置vs阵列vs对象定义

ben*_*ord 5 javascript set ecmascript-6

我不清楚Set和Array在Javascript中的区别是什么(除了Set是ES6中的新功能).为什么要使用Set而不是Array或Object定义.

为什么要介绍Set?

Rik*_*sor 14

集合中的每个值都必须是唯一的,但在Array中,您可以根据需要多次推送相同的值.

"设置对象是值的集合.您可以按插入顺序遍历集合的元素.集合中的值可能只出现一次;它在集合的集合中是唯一的." https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set

有趣的是,在处理少量数据时,删除值,两者之间的性能差异不大(数组和集合),但是当您开始处理大数据时,在集合与数组中删除速度要快得多.

向Array添加值比将它们添加到set要快4倍.

迭代值数组在这里也表现更好(根据数据量呈指数增长).

您可以阅读有关性能差异的更多信息; Javascript设置与阵列性能

"在10k个元素中,两个测试运行时间相似(数组:16.6 ms,设置:20.7 ms),但在处理100k元素时,该集合是明显的赢家(数组:1974.8 ms,设置:83.6 ms)但仅仅因为删除操作.否则阵列更快.我不能确切地说为什么会这样."

计算对象中的唯一项Set Vs Object write-up https://github.com/anvaka/set-vs-object

TL:DR Set几乎是Object的两倍.

为什么Set被引入(我猜)?

有时,当您需要一种简单的方法来构建值集合时,您必须确保每个值都是唯一的.如果数组具有值,则会从旧式检查中带来很多开销,然后推或跳.

我之前链接的性能帖子中没有介绍这种情况,但是对10,000个项目的数组进行快速实验,然后添加15个项目,其中5个重复项目到组合集合,添加到数组中检查重复值并跳过重复它74ms并且只使用set.add(value)设置花了9ms.

你什么时候需要这个?

我想到的一个现实生活中的例子是,如果你有一封电子邮件营销信,你就可以选择; - 电视 - 音乐 - 电影 - 体育

有一天,您的客户或您希望只有一个电子邮件,音乐和电影的电子邮件选项,称为"娱乐".您需要根据这3个不同值中的数据构建新集合,并且您需要确保每封电子邮件仅添加到新的娱乐电子邮件列表中一次.意味着如果用户对两者都感兴趣,用户可以选择加入电影和电视.

在这里你可以设置娱乐,然后遍历所有列表电视/音乐/电影并使用Entertainment.add(电子邮件),该集合将负责跳过列表中已存在的值.因此,避免电子邮件列表中的重复电子邮件.

同时设置将是存储您的电子邮件订阅者地址的最佳格式,因为没有人可能意外地为您的电子邮件选择两次.