Eloquent Javascript练习6.3 - 序列接口

时间:2016-07-14 01:03:53

标签: javascript

我最近毕业于web dev bootcamp,目前正在通过Eloquent Javascript工作。在此练习之前,事情进展顺利。有人可以为我打破这个吗?我不确定为什么每个序列的起始位置都设置为“-1”。

以下是问题: 设计一个抽象迭代值集合的接口。提供此接口的对象表示一个序列,并且接口必须以某种方式使得使用这样的对象的代码可以迭代序列,查看它由它组成的元素值并且有某种方法可以找出何时到达序列的末尾。

当您指定了接口时,尝试编写一个函数logFive,它接受一个序列对象,并在前五个元素或更少的元素上调用console.log,如果序列的元素少于五个。

然后实现一个包装数组的对象类型ArraySeq,并允许使用您设计的接口对数组进行迭代。实现另一个对象类型RangeSeq,它迭代一系列整数(取而代之的是从其构造函数的参数获取)。

和解决方案:

function logFive(sequence) {
    for (var i = 0; i < 5; i += 1) {
        if (!sequence.next()) {
            break;
        }
        console.log(sequence.current());
    }
}
function ArraySeq(array) {
    this.pos = -1;
    this.array = array;
}
ArraySeq.prototype.next = function() {
    if (this.pos >= this.array.length - 1) {
        return false;
    }
    this.pos += 1;
    return true;
}
ArraySeq.prototype.current = function() {
    return this.array[this.pos];
}
function RangeSeq(from, to) {
    this.pos = from - 1;
    this.to = to;
}
RangeSeq.prototype.next = function() {
    if (this.pos >= this.to) {
        return false;
    }
    this.pos += 1;
    return true;
}
RangeSeq.prototype.current = function() {
    return this.pos;
}

logFive(new ArraySeq([1, 2]));
// → 1
// → 2
logFive(new RangeSeq(100, 1000));
// → 100
// → 101
// → 102
// → 103
// → 104

2 个答案:

答案 0 :(得分:1)

该位置最初设置为-1,以允许您编写如下代码:

while (iter.next())
   console.log(iter.current());

在具有基于0的数组(如JavaScript)的语言中,0指向第一个项目,因此如果数组为空,您需要一些其他值,而-1恰好是一个方便的值。

答案 1 :(得分:0)

那是因为RangeSeq.prototype.next将使用无法生成this.pos += 1;的{​​{1}}。