有没有办法在JavaScript中“外包” yield语句?

时间:2018-07-31 12:20:51

标签: javascript function sorting generator

为了让您了解我要做什么: 作为教授排序算法的人,我希望使学生能够轻松地直观了解他们的排序算法如何工作,并发现生成器对此确实非常有用,因为我可以随时中断执行:学生可以编写以下代码可以通过我的库变成动画:

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)(并且在比较的情况下还返回一个布尔值),那就更好了。因此,我希望能够将以上内容表达为:

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 个答案:

答案 0 :(得分:1)

你可以做

 if(yield* compare(i-1,i))

这会将yield内部的compare呼叫传递到外部。