分组与可迭代分组
分组与可迭代分组
pubdate:2019-07-09 11:07:41
题目:标准的 JavaScript 环境提供了另一个名为 Set 的数据结构。 像 Map 的实例一样,集合包含一组值。 与 Map 不同,它不会将其他值与这些值相关联 - 它只会跟踪哪些值是该集合的一部分。 一个值只能是一个集合的一部分 - 再次添加它没有任何作用。写一个名为 Group 的类(因为 Set 已被占用)。 像 Set 一样,它具有 add,delete 和 has 方法。 它的构造器创建一个空的分组,add 给分组添加一个值(但仅当它不是成员时),delete 从组中删除它的参数(如果它是成员),has 返回一个布尔值,表明其参数是否为分组的成员。使用===运算符或类似于 indexOf 的东西来确定两个值是否相同。为该类提供一个静态的 from 方法,该方法接受一个可迭代的对象作为参数,并创建一个分组,包含遍历它产生的所有值。
javascript
class Group {
group=[]
constructor(){}
static from(array){
const group= new Group()
array.forEach(el => {
group.add(el)
});
return group
}
has(el){
return this.group.includes(el)
}
add(el){
if(this.has(el)===false)
this.group.push(el)
}
delete(el){
let index = this.group.indexOf(el);
if (index > -1) {
this.group.splice(index, 1);
}
}
[Symbol.iterator](){
const group=this
let i=0
return {
next:()=>{
return {
value:group.group[i++],
done:i>=group.group.length+1
}
}
}
}
}
let group = Group.from([10, 20]);
console.log(group.has(10));
console.log(group.has(30));
group.add(10);
group.delete(10);
console.log(group.has(10));
可迭代分组
题:使上一个练习中的 Group 类可迭代。 如果你不清楚接口的确切形式,请参阅本章前面迭代器接口的章节。如果你使用数组来表示分组的成员,则不要仅仅通过调用数组中的 Symbol.iterator 方法来返回迭代器。 这会起作用,但它会破坏这个练习的目的。如果分组被修改时,你的迭代器在迭代过程中出现奇怪的行为,那也没问题。
javascript
for (let value of Group.from(["a", "b", "c"])) {
console.log(value);
}