在 JavaScript 中创建迭代器时,数组未传递给 next() 方法
Array is not passed on to next() method while making iterator in JavaScript
我正在自学编码,学习 Java 脚本。我正在处理一本书中的一个问题,我需要为一个自定义对象创建一个迭代器,它的作用类似于一个集合。
当我想访问为保存 next() 方法中的数据而设置的数组时,出现以下错误:
未捕获类型错误:无法读取未定义的 属性 'length'
在 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
没有传递到 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);
}
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);
}
我正在自学编码,学习 Java 脚本。我正在处理一本书中的一个问题,我需要为一个自定义对象创建一个迭代器,它的作用类似于一个集合。
当我想访问为保存 next() 方法中的数据而设置的数组时,出现以下错误:
未捕获类型错误:无法读取未定义的 属性 'length' 在 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
没有传递到 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);
}
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);
}