【问题标题】:How to make the symbol.iterator resume when added a new item to the array向数组添加新项目时如何使 symbol.iterator 恢复
【发布时间】:2021-11-09 20:35:55
【问题描述】:

我通过迭代 Symbol.iterate 对象来打印一个列表。当我向数组中添加新项目时,我希望它恢复打印,但它不起作用。我已经尝试了一些方法来做到这一点,但我做不到。我该如何克服这个问题?

let arr = [{
        name : "Computer",
        sold : 1000
    },
    {
        name: "Printer",
        sold: 250
    },
    {
        name: "Camera",
        sold:290
    },
    {
        name: "Gamepad",
        sold: 800
    },
    {
        name: "Keyboard",
        sold: 2100
    }
]

const iteratorArr = arr[Symbol.iterator]();

const listAll = () => {
    var it = iteratorArr.next()
    while(!it.done) {
        console.log(it.value) 
        it = iteratorArr.next()
    }
}

listAll()

arr.push({name:"Mouse",sold: 2900})
listAll()

【问题讨论】:

    标签: javascript iterator


    【解决方案1】:

    数组迭代器(实际上,任何内置迭代器)不支持在用完一次后恢复。可以在向数组添加值之前创建迭代器,然后仍然对其进行迭代,但您不能在其间运行迭代器完成。示例:

    const arr = ['a', 'b'];
    const iter = arr.values();
    console.log(iter.next().value); // not yet done
    console.log(iter.next().value); // not yet done
    arr.push('c');
    console.log(iter.next().value); // not yet done
    console.log(iter.next().done); // no value left, closing
    arr.push('d');
    console.log(iter.next().done); // still closed

    要获得您想要的行为,您需要实现自己的迭代器:

    let arr = [
        { name : "Computer", sold : 1000 },
        { name: "Printer", sold: 250 },
        { name: "Camera", sold:290 },
        { name: "Gamepad", sold: 800 },
        { name: "Keyboard", sold: 2100 }
    ]
    
    const iteratorArr = {
        index: 0,
        next() {
            const done = this.index >= arr.length
            return {done, value: done ? undefined : arr[this.index++]}
        },
        [Symbol.iterator]() { return this }
    }
    
    const listRemaining = () => {
        for (const value of iteratorArr) {
            console.log(value)
        }
        console.log(iteratorArr);
    }
    
    listRemaining()
    
    arr.push({name:"Mouse",sold: 2900})
    listRemaining()

    【讨论】:

    • 非常感谢。我正在尝试获取这个迭代器概念以及我可以使用它的用途。另外,我没有完全理解结构。所以,每个对象都有一个 next() 特性,它说明每一步要做什么,[Symbol.iterator]() 创建循环,对吧?
    • [Symbol.iterator] 方法只是为了能够使用for 循环的语法糖。如果没有那个和你原来的while循环,它会工作,调用.next()并明确检查.done
    猜你喜欢
    • 1970-01-01
    • 2018-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多