【发布时间】:2020-07-28 07:47:16
【问题描述】:
我想使用带有自定义匹配器回调的生成器遍历 dom 树,当产生值时,返回一个数组,其中包含遍历的节点。假设我有这个结构。
root
/ \
P1 P2
| |
T1 T2
我想做iter.next(isP) 或iter.next(isText) 更新匹配器并逐步直到下一个节点匹配。
type Matcher = (node: INode) => boolean
export function* nextNode(node: INode, matcher: Matcher = () => true, store: []): Generator<INode, any, Matcher> {
let reset: Matcher = matcher
store = store.concat(node)
if (reset(node)) {
reset = yield store
store = []
}
if (node.children) {
for (let childNode of node.children) {
yield *nextNode(childNode, matcher, store)
}
}
return
}
我的代码的问题是 reset 在弹出函数调用堆栈时丢失。例如,如果我在 T1 并且之前的堆栈是 isText,那么现在如果我这样做 iter.next(isP) 将无法工作。我该怎么做?
const iter = nextNode(root, isT)
iter.next() <-- this is T1
iter.next(isP) <-- this is T2 should be P2
【问题讨论】:
标签: javascript typescript iterator generator