Sets https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set现在在 ES2015(又名 ES6,即 ECMAScript 6)中可用。自 2015 年 6 月以来,ES6 一直是 JavaScript 的当前标准。
ECMAScript 6 具有适用于任意对象的数据结构 Set
值,速度快并且可以正确处理 NaN。 -阿克塞尔·劳施梅尔 http://www.2ality.com/, 探索 ES6 http://exploringjs.com/
前两个例子来自阿克塞尔·劳施梅尔的 http://www.2ality.com/ book 探索 ES6 http://exploringjs.com/:
管理单个元素:
> let set = new Set();
> set.add('red')
> set.has('red')
true
> set.delete('red')
true
> set.has('red')
false
确定 Set 的大小并清除它:
> let set = new Set();
> set.add('red')
> set.add('green')
> set.size
2
> set.clear();
> set.size
0
我会检查一下探索 ES6 http://exploringjs.com/如果您想了解有关 JavaScript 中集合的更多信息。这本书可以免费在线阅读,但是如果您想支持作者阿克塞尔·劳施梅尔博士 http://www.2ality.com/您可以花大约 30 美元购买这本书。
如果你想使用 Sets 和 ES6 现在你可以使用Babel https://babeljs.io/、ES6 到 ES5 转译器及其 polyfill。
编辑:截至 2017 年 6 月 6 日,大多数主要浏览器在其最新版本中都具有完整的 Set 支持(IE 11 除外)。这意味着如果您不关心支持旧版浏览器,您可能不需要 babel。如果您想查看不同浏览器(包括您当前的浏览器)的兼容性,请检查Kangax的ES6兼容性表 http://kangax.github.io/compat-table/es6/.
EDIT:
只是对初始化进行澄清。集合可以在其构造函数中采用任何同步迭代。这意味着它们不仅可以接受数组,还可以接受字符串和迭代器。以集合的以下数组和字符串初始化为例:
const set1 = new Set(['a','a','b','b','c','c']);
console.log(...set1);
console.log(set1.size);
const set2 = new Set("aabbcc");
console.log(...set2);
console.log(set2.size);
数组和字符串的输出是相同的。注意...set1
is the 扩展语法 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_syntax。看起来可迭代的每个元素都被一一添加到集合中,因此由于数组和字符串都具有相同的元素,并且由于元素的顺序相同,所以创建的集合是相同的。关于集合需要注意的另一件事是,当迭代它们时,迭代顺序遵循元素插入集合中的顺序。这是迭代集合的示例:
const set1 = new Set(['a','a','b','b','c','c']);
for(const element of set1) {
console.log(element);
}
由于您可以使用任何 iterable 来初始化集合,因此您甚至可以使用来自 a 的迭代器生成器函数 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/function*。以下是产生相同输出的两个迭代器初始化示例:
// a simple generator example
function* getLetters1 () {
yield 'a';
yield 'a';
yield 'b';
yield 'b';
yield 'c';
yield 'c';
}
// a somewhat more commonplace generator example
// with the same output as getLetters1.
function* getLetters2 (letters, repeatTimes) {
for(const letter of letters) {
for(let i = 0; i < repeatTimes; ++i) {
yield letter;
}
}
}
console.log("------ getLetters1 ------");
console.log(...getLetters1());
const set3 = new Set(getLetters1());
console.log(...set3);
console.log(set3.size);
console.log("------ getLetters2 ------");
console.log(...getLetters2('abc', 2));
const set4 = new Set(getLetters2('abc', 2));
console.log(...set4);
console.log(set4.size);
这些示例的生成器函数可以编写为不重复,但如果生成器函数更复杂,并且只要以下内容不会对性能产生太大负面影响,您就可以使用 Set 方法来帮助仅从生成器中获取不重复的值不再重复。
如果您想了解有关集合的更多信息而不阅读 Rauschmayer 博士书中的章节,您可以查看Set 上的 MDN 文档 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set。 MDN 还有更多迭代集合的示例,例如使用forEach
并使用.keys
, .values
, and .entries
方法。 MDN 还提供了集合并集、集合交集、集合差值、对称集差值和集合超集检查等示例。希望大多数这些操作都可以在 JavaScript 中使用,而无需构建您自己的函数来支持它们。事实上,有TC39 对新 Set 方法的提案 https://github.com/tc39/proposal-set-methods如果提案达到第 4 阶段,希望在未来某个时间点将以下方法添加到 JavaScript 中的 Set 中:
- Set.prototype.intersection(iterable) - 方法通过集合交集操作创建新的 Set 实例。
- Set.prototype.union(iterable) - 方法通过集合联合操作创建新的 Set 实例。
- Set.prototype.difference(iterable) - 方法创建新的 Set,但不包含 iterable 中存在的元素。
- Set.prototype.symmetryDifference(iterable) - 返回仅在 this 或 iterable 中找到的元素集。
- Set.prototype.isSubsetOf(可迭代)
- Set.prototype.isDisjointFrom(可迭代)
- Set.prototype.isSupersetOf(可迭代)