分组与可迭代分组

分组与可迭代分组

pubdate:2019-07-09 11:07:41
tags:习题,JavaScript
题目:​标准的 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)); // → true console.log(group.has(30)); // → false group.add(10); group.delete(10); console.log(group.has(10)); // → false

可迭代分组

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