首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使链表在ES6中可迭代

使链表在ES6中可迭代
EN

Stack Overflow用户
提问于 2017-02-17 07:26:43
回答 2查看 1.3K关注 0票数 7

我在JavaScript中有一个链表,我需要用for of循环使其可迭代。我几乎已经完成了,但似乎没有办法将第一个值包含在结果中。这是一个简化的版本:

代码语言:javascript
复制
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)
EN

回答 2

Stack Overflow用户

发布于 2017-02-17 07:32:31

问题是在检索value之前,您要将current移动到下一个节点。

代码语言:javascript
复制
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实现迭代器要容易得多。

代码语言:javascript
复制
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);
}

票数 6
EN

Stack Overflow用户

发布于 2017-02-17 09:15:35

您应该测试current,而不是current.next

代码语言:javascript
复制
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};
      }
    }
  };
}

但可以将其作为生成器方法编写得更简单:

代码语言:javascript
复制
obj[Symbol.iterator] = function* () {
  for (var current = this; current !== null; current = current.next) {
    yield current.value;
  }
}

顺便说一句,我建议不要把这个迭代器放在列表的每个节点上(甚至在第一个节点上)。放入一个指向列表头部的单独对象,或使其成为一个静态辅助函数:

代码语言:javascript
复制
let list = {
  head: obj, // could be null either
  *[Symbol.iterator]() {
    for (var current = this.head; current !== null; current = current.next) {
      yield current.value;
    }
  }
}

代码语言:javascript
复制
function* linkedList(head)
  for (; head !== null; head = head.next) {
    yield head.value;
  } 
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42286657

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档