我已针对实验性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中迭代一套?
答案 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