2013-05-06 283 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