Trampoline over Recursion for Array和Object迭代

时间:2013-03-29 21:50:19

标签: javascript performance recursion continuation-passing trampolines

可能只是“5点以后的星期五,我想回家”的效果,但我对这个问题很难过。我有一个递归迭代器方法,我将调用每个:

function canIterate(obj) {
   return (obj && (typeof obj === 'object' || Array.isArray(obj)));
}

function each(obj, onSuccess, recursive) {
    if (canIterate(obj)) {
        Object.keys(obj).forEach(function(key) {
            var val = obj[key];
            if (onSuccess && val && key) {
                var quit = onSuccess(val, key);
                if (false === quit) {
                    return false;
                }
            }
            if (true === recursive) {
                each(val, onSuccess, true);
            }
        });
    }
}

这对大型数据集来说非常慢(我将在下面解释)。正如@raganwald在此解释的那样,Trampolines are the solution to the problem.我的问题是:我如何重构这个递归函数以利用蹦床技术?

所以我有一个轮询机制来请求树的当前状态,在这种情况下,它是一个位置树,看起来像:

Hospital Campus Main
    Main Building
        Radiology Department
             Lab 1
             Lab 2
             MRI Lab
                 Machine Cabinets
                     Spare Parts Shelf

树在属于位置的事物的网格中呈现,并且对于具有位置的网格中的每一行,我需要将树设置为根设置到该行的位置。所以,如果我们有:

Part   | Location | Tree
widget   MRI Lab    MRI Lab > Machine Cabinets > Spare Parts Shelf

所以不要紧,在服务器端可以处理部分或全部内容 - 我将优化稍后提取数据的性能。

是否有一种有效的方法可以重写我的每种方法以使用Trampoline或CPS style

0 个答案:

没有答案