【问题标题】:Array is not passed on to next() method while making iterator in JavaScript在 JavaScript 中创建迭代器时,数组未传递给 next() 方法
【发布时间】:2021-11-01 23:58:30
【问题描述】:

我正在自学编码,学习 Java Script。我正在解决一本书中的一个问题,我需要为自定义对象创建一个迭代器,它的作用类似于 Set。

当我想访问我设置为在 next() 方法中保存数据的数组时,我收到以下错误:

未捕获的类型错误:无法读取未定义的属性“长度” 在 Object.next (testerBook.js:34) 在 testerBook.js:83

在 next() 方法中,数组未定义。

代码如下:

class Group {
  constructor() {
    this.values = [];
  }

  add(value) {
    if (!this.values.includes(value)) {
      this.values.push(value);
    }
  }

  delete(value) {
    if (this.values.includes(value)) {
      this.values = this.values.filter(e => e !== value);
    }
  }

  has(value) {
    return this.values.includes(value);
  }

  [Symbol.iterator]() {

    let count = 0;
    let nvalues = this.values;
    console.log('nvalues is ', nvalues);

    return {
      next() {
        console.log('In next in iterator ', this.nvalues);
        //try the ++ count afterwards
        if (count === this.values.length - 1) {
          return {
            value: undefined,
            done: true
          };
        } else {
          count++;
          return {
            value: this.values[count - 1],
            done: false
          };
        }

      }
    }
  }

  static from(newValues) {
    let group = new Group();
    for (let value of newValues) {
      if (!group.has(value)) {
        group.add(value);
      }
    }
    return group;
  }

}


let group = Group.from([1, 2, 3, 4, 3, 2, 1, 5]);
console.log(group.values);
for (let value of group) {
  console.log(value);
}

我希望这是一件我看不到的简单事情。任何帮助将不胜感激!

【问题讨论】:

  • 您能否在实例化、调用和使用该对象的代码中包含一个完全可重现的示例?
  • this 不是 Group 方法中的 Group 对象。
  • 我已经在编辑中添加了完整的代码

标签: javascript iterator


【解决方案1】:

this 不会在传统闭包中捕获。

您可以使用nvalues 局部变量,就像使用count 一样。

class Group {
  constructor() {
    this.values = [];
  }

  add(value) {
    if (!this.values.includes(value)) {
      this.values.push(value);
    }
  }

  delete(value) {
    if (this.values.includes(value)) {
      this.values = this.values.filter(e => e !== value);
    }
  }

  has(value) {
    return this.values.includes(value);
  }

  [Symbol.iterator]() {

    let count = 0;
    let nvalues = this.values;
    console.log('nvalues is ', nvalues);

    return {
      next() {
        console.log('In next in iterator ', this.nvalues);
        //try the ++ count afterwards
        if (count === nvalues.length - 1) {
          return {
            value: undefined,
            done: true
          };
        } else {
          count++;
          return {
            value: nvalues[count - 1],
            done: false
          };
        }

      }
    }
  }

  static from(newValues) {
    let group = new Group();
    for (let value of newValues) {
      if (!group.has(value)) {
        group.add(value);
      }
    }
    return group;
  }

}


let group = Group.from([1, 2, 3, 4, 3, 2, 1, 5]);
console.log(group.values);
for (let value of group) {
  console.log(value);
}

【讨论】:

    【解决方案2】:

    this 未传递到 next 函数中。您可以使用箭头函数将其隐式传递。

    还有迭代器提前结束,把if (count === this.values.length - 1) {改成if (count === this.values.length) {

    class Group {
        constructor() {
            this.values = [];
        }
    
        add(value) {
            if (!this.values.includes(value)) {
                this.values.push(value);
            }
        }
    
        delete(value) {
            if (this.values.includes(value)) {
                this.values = this.values.filter(e => e !== value);
            }
        }
    
        has(value) {
            return this.values.includes(value);
        }
    
        [Symbol.iterator]() {
            
            let count = 0;
            let nvalues = this.values;
            console.log('nvalues is ', nvalues);
    
            return {
                next: () => {
                    console.log('In next in iterator ', JSON.stringify(this,null,2));
                    //try the ++ count afterwards
                    if (count === this.values.length) {
                        return { value: undefined, done: true };
                    } else {
                        count++;
                        return { value: this.values[count - 1], done: false };
                    }
    
                }
            }
        }
        
        static from(newValues) {
          let group = new Group();
          for (let value of newValues) {
            if (!group.has(value)) {
              group.add(value);
            }
          }
          return group;
        }
    }
    
    let group = Group.from([1, 2, 3, 4, 3, 2, 1, 5]);
    console.log(group.values);
    for (let value of group) {
      console.log(value);
    }

    【讨论】:

    • 谢谢!我将进一步了解它如何与箭头函数和常规函数()一起工作;
    猜你喜欢
    • 2020-04-17
    • 2012-06-19
    • 2020-02-05
    • 1970-01-01
    • 2012-11-02
    • 2015-06-05
    • 1970-01-01
    • 2014-12-21
    • 2011-06-23
    相关资源
    最近更新 更多