javascript - 在 ES6 中使链表可迭代

标签 javascript linked-list iterator ecmascript-6 iterable

我有一个 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)

最佳答案

问题是您在检索 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);
}

关于javascript - 在 ES6 中使链表可迭代,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42286657/

相关文章:

c++ - 在创建此函数以从 C++ 中的单链表搜索元素时,我在哪里犯了错误?

c - 如何保存到链接列表?

ruby - 是否可以检查 Ruby 中迭代器的位置?

javascript - jQuery 隐藏和仅显示源文件

javascript - 在 JSP 或 Javascript 中获取标签的值

javascript - Multer [NodeJS] 用于多个字段

javascript - 将双轴 Highcharts 中的 y 轴值转换为百万

java - 如何从链表堆栈中推送或弹出

java - 如何处理这个不会构造的迭代器类型的对象?

c++ - 嵌套迭代器错误