web-dev-qa-db-ja.com

設定された要素を反復処理する

私は、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?のセットを反復処理することは可能ですか?

34
Randomblue

of演算子 Chromeでは現在サポートされていないようです 。 FireFoxバージョン13〜18のみがサポートしているようです。また、テストの一部は存在を表し、完全な機能や一貫性を表していないとページに書かれていますが、どのブラウザーも実際にSetをサポートしていないようです。したがって、SetがChromeに部分的に実装されている可能性があります。

4
Vivin Paliath

非常に簡単な方法は、最初にSetを配列に変換することです:

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

...そして単純なforループを使用します。

17
luschn

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);
}
15
bizi

forEach(..);関数を使用します。 ( ドキュメント

13
FranXh

繰り返しの構文糖がまだ実装されていない場合でも、おそらくイテレータを使用できます。

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; }
  }
}
_
4
Mike Samuel

@ 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);
 }
0
Tech