首页 - 崮生写笔记的地方

分组与可迭代分组

题目: 标准的 JavaScript 环境提供了另一个名为Set的数据结构。 像Map的实例一样,集合包含一组值。 与Map不同,它不会将其他值与这些值相关联 - 它只会跟踪哪些值是该集合的一部分。 一个值只能是一个集合的一部分 - 再次添加它没有任何作用。 写一个名为Group的类(因为Set已被占用)。 像Set一样,它具有add,delete和has方法。 它的构造器创建一个空的分组,add给分组添加一个值(但仅当它不是成员时),delete从组中删除它的参数(如果它是成员),has 返回一个布尔值,表明其参数是否为分组的成员。 使用===运算符或类似于indexOf的东西来确定两个值是否相同。 为该类提供一个静态的from方法,该方法接受一个可迭代的对象作为参数,并创建一个分组,包含遍历它产生的所有值。

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));
// → true
console.log(group.has(30));
// → false
group.add(10);
group.delete(10);
console.log(group.has(10));
// → false

可迭代分组

题: 使上一个练习中的Group类可迭代。 如果你不清楚接口的确切形式,请参阅本章前面迭代器接口的章节。 如果你使用数组来表示分组的成员,则不要仅仅通过调用数组中的Symbol.iterator方法来返回迭代器。 这会起作用,但它会破坏这个练习的目的。 如果分组被修改时,你的迭代器在迭代过程中出现奇怪的行为,那也没问题。

// Your code here (and the code from the previous exercise)

for (let value of Group.from(["a", "b", "c"])) {
  console.log(value);
}
// → a
// → b
// → c
代码库-git