2013-05-06 179 views
18

我已经打开了Chrome标志实验ECMAscript 6功能,其中之一是Set。据我了解,Set的细节得到了规范作者的广泛认同。遍历设置的元素

我创建了一套a并添加字符串'Hello'

a = Set(); 
a.add('Hello'); 

,但我怎么遍历的a的要素是什么?

for(let i of a) { console.log(i); } 

给出 “语法错误:非法let声明外扩展模式”

for(var i of a) { console.log(i); } 

给出 “语法错误:意外的标识符”

for(var i in a) { console.log(i); } 

给出Undefined

是否有可能迭代在Chrome 26中的一套?

+2

[看起来像](http://kangax.github。io/es5-compat-table/es6)目前仅支持Firefox ... – 2013-05-06 14:49:19

+0

[如何在JavaScript中实现一个集合](http://www.javascriptexamples.org/2011/01/17/how-to-实现一个在JavaScript中设置/) – NullPointerException 2013-05-06 14:56:50

+0

你可以使用这个:http://jsclass.jcoglan.com/set.html – 2013-05-06 15:14:21

回答

2

of运营商doesn't appear to be currently supported in Chrome。似乎只有FireFox版本13到18支持它。它似乎也没有一个浏览器实际上支持Set,虽然页面确实说一些测试代表存在而不是完整的功能或一致性。因此,Chrome可能部分实现了Set

4

即使迭代的语法糖还没有实现,你仍然可以使用迭代器。

http://www.2ality.com/2012/06/for-of-ff13.html解释

The special method __iterator__ returns an iterator object. Such an object has a method next() that either returns the next element in the current iteration sequence or throws StopIteration if there are no more elements.

所以,你应该能够遍历使用

for (var it = mySet.__iterator__();;) { 
    var element; 
    try { 
    element = it.next(); 
    } catch (ex) { 
    if (ex instanceof StopIteration) { 
     break; 
    } else { 
     throw ex; 
    } 
    } 
    // Do something with element 
} 

您还可以定义为&hellip功能版本的集合;像

function forOf(collection, f) { 
    // jQuery.each calling convention for f. 
    var applyToElement = f.bind(/* this */ collection, /* index */ void 0); 
    for (var it = mySet.__iterator__();;) { 
    var element; 
    try { 
     element = it.next(); 
    } catch (ex) { 
     if (ex instanceof StopIteration) { 
     break; 
     } else { 
     throw ex; 
     } 
    } 

    // jQuery.each return convention. 
    if (applyToElement(element) === false) { break; } 
    } 
} 
+1

谢谢。尽管如此,这有点不幸。 – Randomblue 2013-05-06 16:18:17

+3

@Randomblue,是的。语法糖是为了遮盖所有这些,但通常不同的人在解析器中实现语法支持,而不是实现库代码,因此您可以获得具有一半功能的版本。当它的语法滞后时,你只能自己脱糖,这需要看看香肠是如何制作的。 – 2013-05-06 16:24:36

+0

在最新的Node v0.11.4中没有'__iterator__'方法。 – Randomblue 2013-07-13 09:46:38

8

我使用forEach(..);函数。

4

在从MDN规范,Setvalues方法:

The values() method returns a new Iterator object that contains the values for each element in the Set object in insertion order.

所以,通过数值迭代,我会做:

var s = new Set(['a1', 'a2']) 
for (var it = s.values(), val= null; val=it.next().value;) { 
    console.log(val); 
} 
+0

当迭代停止时呢?根据文档,StopIteration将被抛出。使用异常停止迭代是一个可怕的解决方案。 – 2018-02-21 13:00:28

+0

如果您所指的是关于迭代器的MDN文档,我不确定他们的文档是否仍然准确,但他们在页面上也有警告。迭代器一旦到达终点就会停止前进。 – bizi 2018-02-28 02:00:56

0

@bizi's answer是接近,但它没有工作为了我。这个工作在Firefox上:

var s= new Set([1,2]), 
    it = s.values(); 
for (var val= it.next().value; val=it.next().value;) { 
    console.log("set: "+val); 
} 
4

一个非常简单的方法就是把设置为Array第一:

let a = Set(); 
a.add('Hello'); 
a = Array.from(a); 

...,然后只用一个简单的for循环。

+0

此外,它还有第二个可选参数,它是一个映射函数,用于调用每个元素,即:a = Array.from(a,e => e.length)'。 – Adamantium 2018-02-02 08:11:06