JavaScript 迭代器模式

147 阅读1分钟

提供一种方法顺序访问一个聚合对象中各个元素, 而又无须暴露该对象的内部表示。

大概就是,为有顺序的集合,进行遍历迭代。
包括但不限于 Array, String, Map, arguments, NodeList。
es6对迭代器实现 Iterator Array.prototype[Symbol.iterator] 只要有 [Symbol.iterator] 就代表这个数据可以迭代

class Iterator {
    constructor(box) {
        this.box = box
        this.index = 0
    }
    
    next() {
        const list = this.box.list
        const flag = this.hasNext()
        if(flag) {
            return {value: list[this.index++], flag}
        } else {
            return {value: undefined, flag}
        }
    }
    
    hasNext() {
        const lg = this.box.list.length
        if(this.index >= lg) return false
        else return true
    }
}

class Box {
    
    constructor(list) {
        this.list = list
    }
    
    getIterator() {
        return new Iterator(this)
    }
}

function each(data) {
    if(Array.isArray(data)){
    
        const box = new Box(data)
        const iterator = box.getIterator()
        
        let item = {flag: true}
        while(item.flag) {
            item = iterator.next()
            if(item.flag) console.log(item.value)
        }
    }
}

each([1, 2, 3, 4, 5])