有没有一种方法可以在JavaScript中“外包”yield语句?

4
为了让您了解我所尝试的内容: 作为一名教授排序算法的人,我希望能够让学生轻松地可视化他们的排序算法是如何工作的,并且发现生成器非常有用,因为我可以在任何时候中断执行:学生可能编写以下代码,但我的库可以将其转换为动画:
function* bubbleSort(arr){
    let done = false;
    while(!done){
        done = true;
        for(let i=1;i<arr.length;i++){
            yield {type:"comparison",indexes:[i-1,i]};
            if(arr[i-1]>arr[i]){
                yield {type:"swap",indexes:[i-1,i]};
                swap(arr,i-1,i);
                done = false;
            }
        }
    }
    return "sorted";
}

这个方法效果不错,但如果我能编写函数compare(i,j)swap(i,j)来处理yield(在比较的情况下还返回布尔值),会更好。所以我希望能像下面这样表达:

function* bubbleSort(arr){
    let done = false;
    while(!done){
        done = true;
        for(let i=1;i<arr.length;i++){
            if(compare(i-1,i)){
                swap(arr,i-1,i);
                done = false;
            }
        }
    }
    return "sorted";
}

有没有一种方法可以做到这一点?
1个回答

2
你可以直接这样做:
 if(yield* compare(i-1,i))

这将把compare内部的yield调用传递到外部。


“yield*” 看起来很适合不需要返回值的 “swap()” 函数,但是如何构建 “compare” 才能使您的语句生效呢? - Anton Ballmaier
@anton,它的效果与预期一致,只需从compare返回true;,就会进入if分支。 - Jonas Wilms
非常感谢,我明白了 :) - Anton Ballmaier
@anton 很高兴能帮忙 :) - Jonas Wilms

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接