ES6之迭代器

108 阅读1分钟

ES6之迭代器

//迭代器
function createIterator(arr) {
    let i = 0;
    return {
        next() {
            const result = {
                value: arr[i],
                done: i >= arr.length
            }
            i++;
            return result;
        }
    };
}
const arr1 = [1, 2, 3, 4, 5]
const arr2 = [6, 7, 8, 9, 10]
const iter1 = createIterator(arr1)
const iter2 = createIterator(arr2)
let data = iter1.next()
while (!data.done) {
    console.log(data.value)
    data = iter1.next()
}
console.log('迭代器结束')

迭代是只关注能否取出下一个,关注当前的状态,遍历是必须取出所有的元素。当我们无法确定仓库或数据集的所有元素,或者没有必要去一一得到时,这种一个一个不断取数据的迭代方式就会特别适合。
为了成为迭代器,里面必须有一个方法 next() 保证可以取出下一个,返回一个对象。这个对象里面必须有 value , done ,value 保证当前的数据值,done 是不能超出数据集的范围。
之后使用 while 不断循环 data.done ,一旦超出范围就会结束循环。 比如在斐波那契数列中使用迭代器就特别适合,因为这种数列是无限扩展,无法确定数列的全部元素。

function createFeiboIterator() {
    let prev1 = 1, prev2 = 1, n = 1;//定义前一位,前两位,数列的第n位
    return {
        next() {
            let value;//定义当前项
            //前两项为1
            if (n <= 2) {
                value = 1;
            } else {
                value = prev1 + prev2;
            }
            const result = {
                value,
                done: false,//永远无法拿到最后一位
            }
            //前面两个数据往后移一位
            prev2 = prev1;
            prev1 = result.value;
            n++;
            return result;
        }

    }
}

斐波那契数列后一项等于前两项的值,然后在调用 next() 方法的时候前面两个数据往前面移一位,这样就可以不断取出元素。