我在JavaScript中有一个链表,我需要用for of循环使其可迭代。我几乎已经完成了,但似乎没有办法将第一个值包含在结果中。这是一个简化的版本:
var obj = {value: 1, next: {value: 2, next: {value: 3, next: {value: 4, next: {value: 5, next: {value: 6, next: {value:7, next: null}}}}}}};
obj[Symbol.iterator] = function() {
var current = this;
return {
next() {
if (current.next !== null) {
current = current.next;
return {value: current.value, done: false};
}
return {done: true}
}
}
}
for (const x of obj) {
console.log(x)
}
// this is how you get the values printed with no loop
// console.log(obj.value + '->' + obj.next.value + '->' + obj.next.next.value)发布于 2017-02-17 07:32:31
问题是在检索value之前,您要将current移动到下一个节点。
var obj = {value: 1, next: {value: 2, next: {value: 3, next: {value: 4, next: {value: 5, next: {value: 6, next: {value:7, next: null}}}}}}};
obj[Symbol.iterator] = function() {
var current = this;
return {
next() {
if (current) {
var value = current.value;
current = current.next;
return {value: value, done: false};
}
return {done: true};
}
};
};
for (const x of obj) {
console.log(x);
}
使用generator function实现迭代器要容易得多。
var obj = {value: 1, next: {value: 2, next: {value: 3, next: {value: 4, next: {value: 5, next: {value: 6, next: {value:7, next: null}}}}}}};
obj[Symbol.iterator] = function*() {
var current = this;
while (current) {
yield current.value;
current = current.next;
}
};
for (const x of obj) {
console.log(x);
}
发布于 2017-02-17 09:15:35
您应该测试current,而不是current.next
obj[Symbol.iterator] = function() {
var current = this;
return {
next() {
if (current !== null) {
var res = {value: current.value, done: false};
current = current.next;
return res;
} else {
return {done: true};
}
}
};
}但可以将其作为生成器方法编写得更简单:
obj[Symbol.iterator] = function* () {
for (var current = this; current !== null; current = current.next) {
yield current.value;
}
}顺便说一句,我建议不要把这个迭代器放在列表的每个节点上(甚至在第一个节点上)。放入一个指向列表头部的单独对象,或使其成为一个静态辅助函数:
let list = {
head: obj, // could be null either
*[Symbol.iterator]() {
for (var current = this.head; current !== null; current = current.next) {
yield current.value;
}
}
}
function* linkedList(head)
for (; head !== null; head = head.next) {
yield head.value;
}
}https://stackoverflow.com/questions/42286657
复制相似问题