私は、ECMAscript 6の実験的な機能のChromeフラグをオンにしました。そのうちの1つはSet
です。理解しているように、Set
仕様書作成者による。
セットa
を作成し、文字列'Hello'
を追加します
a = Set();
a.add('Hello');
しかし、どのようにしてa
の要素を反復処理しますか?
for(let i of a) { console.log(i); }
「SyntaxError:拡張モード外の不正なlet
宣言」を与える
for(var i of a) { console.log(i); }
「SyntaxError:Unexpected identifier」を与える
for(var i in a) { console.log(i); }
Undefined
を与える
Chrome 26?のセットを反復処理することは可能ですか?
of
演算子 Chromeでは現在サポートされていないようです 。 FireFoxバージョン13〜18のみがサポートしているようです。また、テストの一部は存在を表し、完全な機能や一貫性を表していないとページに書かれていますが、どのブラウザーも実際にSet
をサポートしていないようです。したがって、Set
がChromeに部分的に実装されている可能性があります。
非常に簡単な方法は、最初にSetを配列に変換することです:
let a = new Set();
a.add('Hello');
a = Array.from(a);
...そして単純なforループを使用します。
MDNの仕様では、Set
には values メソッドがあります。
Values()メソッドは、Setオブジェクトの各要素の値を挿入順に含む新しいIteratorオブジェクトを返します。
したがって、値を反復処理するには、次のようにします。
var s = new Set(['a1', 'a2'])
for (var it = s.values(), val= null; val=it.next().value; ) {
console.log(val);
}
forEach(..);
関数を使用します。 ( ドキュメント )
繰り返しの構文糖がまだ実装されていない場合でも、おそらくイテレータを使用できます。
http://www.2ality.com/2012/06/for-of-ff13.html の説明
特別なメソッド_
__iterator__
_は、イテレータオブジェクトを返します。そのようなオブジェクトにはメソッドnext()
があり、現在の反復シーケンスの次の要素を返すか、要素がもうない場合にStopIteration
をスローします。
したがって、次のコマンドを使用してセットを反復処理できるはずです。
_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
}
_
また、…の機能バージョンを定義することもできます。
_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; }
}
}
_
@ 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);
}