【问题标题】:How does [...new set(array)] works in javascript?[...new set(array)] 如何在 javascript 中工作?
【发布时间】:2020-09-16 21:51:28
【问题描述】:
const ages = [26, 27, 26, 26, 28, 28, 29, 29, 30]
const uniqueAges = [...new Set(ages)]

console.log(uniqueAges) // [26,27,28,29,30]

我知道 Spread 运算符,我搜索了 set,但没有找到关于它如何工作的解释。

如何设置比较物品并找到相似物品? 如果设置在比较中使用循环

非常感谢任何帮助

【问题讨论】:

  • 集合的一个数学属性是包含唯一值。您将数组转换为集合并将结果传播回数组。这是获取具有唯一值的数组的惯用方法
  • 这能回答你的问题吗? es6 unique array of objects with set
  • 有关Sets 的信息,请参阅here。本质上,Set 是唯一值的集合——即它不能包含重复值。所以new Set(ages) 是一个包含ages 中所有值的集合,必须删除重复的值。然后扩展运算符只是将其转换回数组 - 整体效果只是从数组中删除重复项。
  • 所以在这个操作中使用了一个循环?谢谢你们

标签: javascript object javascript-objects


【解决方案1】:

Set 只能包含唯一值;根据MDN,这是构成相等值的内容:

因为Set 中的每个值都必须是唯一的,所以将检查值是否相等。在早期版本的 ECMAScript 规范中,这不是基于与 === 运算符中使用的算法相同的算法。具体来说,对于Sets,+0(严格等于-0)和-0 是不同的值。然而,这在 ECMAScript 2015 规范中有所改变。有关详细信息,请参阅浏览器兼容性表中的“-00 的密钥相等性”。

NaNundefined 也可以存储在Set 中。所有NaN 值都相等(即NaN 被认为与NaN 相同,即使NaN !== NaN 也是如此)。

使用传递数组的iterable interface 创建Set 有一个隐式循环。 ... 中还有一个循环,它解压了一个可迭代对象。

然而,检查一个元素是否已经在Set 中并不是使用循环来完成的——出于所有意图和目的,您可以将Set 视为只有键而没有值的字典。代码几乎是一样的:

const ages = [26, 27, 26, 26, 28, 28, 29, 29, 30]

const temp = {};
for (const age of ages) {
  temp[age] = true;
}

const uniqueAges = [];
for (const age in temp) {
  uniqueAges.push(age);
}

console.log(uniqueAges);

我故意写这种“低技术”的方式来说明正在发生的事情;请注意,对象键始终是字符串,因此结果将被字符串化。使用 Map 或将年龄存储为 会使其在效果上与 OP 的代码更加相似,但为了便于说明,我想保持简单。

【讨论】:

    猜你喜欢
    • 2017-09-01
    • 1970-01-01
    • 2011-10-08
    • 2010-12-20
    • 2015-08-14
    • 2011-07-26
    相关资源
    最近更新 更多