【问题标题】:Iterator for array数组的迭代器
【发布时间】:2016-02-24 14:24:56
【问题描述】:

来自JavaScript Iterators

var Iterator = function(arr){ return {
    index : -1,
    hasNext : function(){ return this.index <= arr.length; },
    hasPrevious: function(){ return this.index > 0; },

    current: function(){ return arr[ this["index"] ]; },

    next : function(){
        if(this.hasNext()){
            this.index = this.index + 1;            
            return this.current();
        } 
        return false;
    },

    previous : function(){
        if(this.hasPrevious()){
            this.index = this.index - 1
            return this.current();
        }
        return false;
    }
}   
};

var iter = Iterator([1,2,3]);

我想通过添加动态值来重写这个功能

   added : function(data){
          arr.push(data);
          this.index++
        }


iter.added(1);
iter.added(6);
iter.added(7);
iter.added(8);

怎么做? 我知道 ES 6 https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/Iterator 中的迭代器,但我想要支持 IE

【问题讨论】:

  • added 中删除this.index++ 即可。或者不是吗?为什么不呢?
  • 好的.....但是我想在添加时更改当前索引
  • 好吧,这出乎我的意料,但去吧。现在你的问题是什么?
  • 您是否尝试在 python 中实现类似于.sendnext(value)
  • 顺便说一句,hasNext 方法给出了错误的结果

标签: javascript


【解决方案1】:

您需要添加与您发布的内容类似的 added() 函数,然后更新 index 的初始值,以便 next() 和 previous() 函数起作用。您需要将其设置为输入数组长度,以便 next() 函数知道您位于最后一个元素。

var Iterator = function(arr){ return {
    index : arr.length,
    hasNext : function(){ return this.index < arr.length - 1; },
    hasPrevious: function(){ return this.index > 0; },

    current: function(){ return arr[ this.index ]; },

    next : function(){
        if(this.hasNext()){
            this.index = this.index + 1;            
            return this.current();
        } 
        return false;
    },

    previous : function(){
        if(this.hasPrevious()){
            this.index = this.index - 1
            return this.current();
        }
        return false;
    },

    added: function(x){
        arr.push(x);
      this.index++;
    }
}   
};

var iter = Iterator([1,2,3]);
console.log(iter)
iter.added(1);
iter.added(6);
iter.added(7);
iter.added(8);
console.log(iter)
console.log(iter.next())
console.log(iter.previous())
console.log(iter.previous())
console.log(iter.previous())
console.log(iter.previous())
console.log(iter.next())
console.log(iter.current())

哪些输出:

对象 {arr: Array[3], index: 3}
对象 {arr: Array[7], index: 7}

8
7
6
1
6
6

这是一个小提琴:https://jsfiddle.net/8ojcrnkn/5/

希望有帮助!

【讨论】:

  • 您在代码中究竟做了哪些更改? “声明arr”是什么意思,它已经被声明了?
  • 你需要能够从added函数访问arr,所以你需要添加它,见第2行。
  • 当我调用 iter.next() 时返回 6 .... 但我想返回 false /// 只支持 prev()
  • @AdamKonieska:请注意,它也在 hasNextcurrent 函数中。并且无处可作为属性访问。你不需要那个。您可以直接访问该变量。见How do JavaScript closures work?
  • @zloctb: 如果你想让迭代器从最后开始,你应该让index: arr.length
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-14
  • 2017-07-03
  • 1970-01-01
  • 2011-04-23
  • 2017-02-09
  • 2012-01-09
  • 1970-01-01
相关资源
最近更新 更多