迭代集合元素

时间:2013-05-06 14:44:20

标签: javascript ecmascript-6

我已针对实验性ECMAscript 6功能启用了Chrome标记,其中一个功能为Set。据我了解,Set的详细信息已得到规范编写者的广泛认同。

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

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

但我如何迭代a的元素?

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

在扩展模式下给出“SyntaxError:Illegal let声明”

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

给出“SyntaxError:Unexpected identifier”

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

给出Undefined

是否可以在Chrome 26中迭代一套?

11 个答案:

答案 0 :(得分:13)

一种非常简单的方法是首先将Set转换为数组:

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

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

答案 1 :(得分:11)

我使用forEach(..);功能。 (documentation

答案 2 :(得分:11)

根据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);
}

答案 3 :(得分:4)

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

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 :(得分:4)

您可以使用两种方法。 用于... forEach

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

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

a.forEach(key => console.log(key))

答案 5 :(得分:3)

of运算符doesn't appear to be currently supported in Chrome。似乎只有FireFox版本13到18支持它。似乎没有一个浏览器实际上支持Set,尽管该页面确实表示某些测试表示存在而不是完整的功能或一致性。因此,可能会在Chrome中部分实现Set

答案 6 :(得分:1)

您还可以使用展开运算符将 Set 转换为数组(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');

答案 7 :(得分: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);
 }

答案 8 :(得分:0)

这对我有用

mySet.forEach(async(item) =>{
   await doSomething(item)
 })

答案 9 :(得分: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]);

答案 10 :(得分:0)

一种简单的功能性方法是仅使用forEach

const mySet = new Set([1, 2, 3])
mySet.forEach(a => { console.log(a) })
// 1 2 3