80

我已经为实验性 ECMAscript 6 功能打开了 Chrome 标志,其中之一是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 中的集合?

4

11 回答 11

61

一个非常简单的方法是先将 Set 变成 Array:

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

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

请注意,Array.fromIE11 不支持。

于 2017-06-20T14:14:18.250 回答
34

根据 MDN 的规范,Set有一个values方法:

values() 方法返回一个新的 Iterator 对象,该对象按插入顺序包含 Set 对象中每个元素的值。

所以,为了遍历这些值,我会这样做:

var s = new Set(['a1', 'a2'])
for (var it = s.values(), val= null; val=it.next().value; ) {
    console.log(val);
}
于 2017-01-14T19:18:33.390 回答
29

我使用该forEach(..);功能。(文档

于 2014-07-09T16:38:36.057 回答
15

您可以使用两种方法。 for...offorEach

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

for(let key of a) console.log(key)

a.forEach(key => console.log(key))
于 2020-06-02T06:22:14.997 回答
9

Chrome 目前似乎不支持of运算符。似乎只有 FireFox 版本 13 到 18 支持它。尽管页面确实说某些测试代表存在而不是完整的功能或连贯性,但似乎没有任何浏览器真正支持。所以它可能是在 Chrome 中部分实现的。SetSet

于 2013-05-06T16:09:16.237 回答
7

您还可以使用扩展运算符将 aSet转换为数组(替代Array.from(yourSet))。

const mySet = new Set();

mySet.add('a');
mySet.add('b')

const iterableSet = [...mySet];
// end up with: ['a', 'b']

// use any Array method on `iterableSet`
const lettersPlusSomething = iterableSet.map(letter => letter + ' something');
于 2020-12-31T19:29:04.050 回答
5

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

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
}

您还可以定义 for...of like 的功能版本

function forOf(collection, f) {
  // jQuery.each calling convention for f.
  var applyToElement = f.bind(/* this */ collection, /* index */ void 0);
  for (var it = collection.__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; }
  }
}
于 2013-05-06T16:09:47.947 回答
4

一个简单的功能方法是只使用forEach

const mySet = new Set([1, 2, 3])
mySet.forEach(a => { console.log(a) })
// 1 2 3
于 2020-12-15T17:12:24.160 回答
2

这对我有用

mySet.forEach(async(item) =>{
   await doSomething(item)
 })
于 2019-12-05T01:02:20.553 回答
0
let set = new Set();
set.add(1);
set.add(2);

// This will be an array now, now you can loop normally.
console.log([...set]);
于 2020-07-31T09:18:03.170 回答
-1

@bizi 的答案很接近,但对我不起作用。这适用于 Firefox:

var s= new Set([1,2]),
     it = s.values();
 for (var val= it.next().value; val=it.next().value;) {
     console.log("set: "+val);
 }
于 2017-04-14T00:18:38.140 回答