【问题标题】:How do I iterate through an instance of this List class in JavaScript如何在 JavaScript 中遍历这个 List 类的实例
【发布时间】:2015-03-31 08:24:30
【问题描述】:

我正在尝试通过以下方式遍历列表 var names = new List();

var names = new List();
names.append('tom');
names.append('bob');
names.append('marshal');
names.append('Cartman');
names.append('Randy');

for(names.top(); names.currentPosition() < names.length(); names.next()) {
  console.log(names.getElement()); // going on and on stuck at one index! infinite loop!!!
}

我得到一个列表索引不变的无限循环。什么 会不会出错?

假设列表已经使用append 方法填充了值。绝对不是空的。下面是 List 类的实现:

function List() {
  this.dataStore = [];
  this.listSize = 0;
  this.position = 0;
}

List.prototype = {

  clear: function() {
    delete this.dataStore;
    this.dataStore = [];
    this.position = this.listSize = 0;
  },

  toString: function() {
    return this.dataStore.join(' \n');
  },

  getElement: function() {
    return this.dataStore[this.position];
  },

  append: function(el) {
    this.dataStore[this.listSize++] = el;
  },

  top: function() {
    this.position = 0;
  },

  bottom: function() {
    this.position = this.listSize - 1;
  },

  prev: function() {
    if(this.position > 0) {
      this.position--;
    }
  },

  next: function() {
    if(this.position < this.listSize - 1) {
      this.position++;
    }
  },

  length: function() {
    return this.listSize;
  },

  currentPosition: function() {
    return this.position;
  },

};

【问题讨论】:

    标签: javascript list memory-management data-structures memory-leaks


    【解决方案1】:

    您的next() 函数不会增加this.position 的值超过this.listSize - 1,因此for 循环的条件部分将始终计算为true,因为您的currentPosition() 将始终小于您的@987654326 @。

    例如,您的 List 中有 1 个元素。这是 for 循环值:

    names.top() = 0
    names.currentPosition() = 0
    names.length() = 1
    

    调用names.next() 检查this.position &lt; this.listSize - 1。这可以重写:0 &lt; (1 - 1)。所以 next 不会增加 this.position 并且你的 for 循环会无限运行。

    【讨论】:

    • 感谢您指出这一点。我已经删除了 next() 方法上的 this.position &lt; this.listSize - 1 约束。您是否认为此更改可能会导致列表在其他地方出现意外行为?比如说,当用户使用 next() 次数过多并将其递增到列表大小之外。
    • @ng-hacker-319 可能。你可以做很多不同的选择。一种可能是设计一个单独的类,作为列表的外部迭代器,提供hasNext()next() 之类的方法,并将其自己的位置保持在当前遍历列表的位置。另一种选择是让您的next() 函数在增加位置的同时简单地返回值,如果您到达列表的末尾,只需返回null。返回null 的唯一问题是您的List 将无法在其中包含null 作为有效值。
    猜你喜欢
    • 2018-08-17
    • 2010-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-25
    • 1970-01-01
    • 2013-12-28
    相关资源
    最近更新 更多