在第n级停止递归函数?

时间:2018-03-19 20:05:59

标签: recursion

我正在尝试使用以下函数对mousewheel事件进行字符串化。该函数在其他实例中工作正常,但在这种情况下,我得到Maximum call stack size exceeded。我怎样才能使它只返回n th 级别的属性/方法?

function cloneAsObject(obj) {
    if (obj === null || !(obj instanceof Object)) {
        return obj;
    }
    var temp = (obj instanceof Array) ? [] : {};
    for (var key in obj) {
        temp[key] = cloneAsObject(obj[key]);
    }
    return temp;
}

1 个答案:

答案 0 :(得分:1)

修改:下面的原始答案会导致错误:

Uncaught TypeError: Converting circular structure to JSON

因此递归水平不是问题(正如Alexandre Dupriez已经评论过的那样)。这是一个返回简单字符串表示的函数,忽略嵌套对象和函数(请参阅此答案Converting circular structure to JSON):

function simpleStringify (obj){
    var simpleObject = {};
    for (var prop in obj ){
        /*if (!obj.hasOwnProperty(prop)){
            continue;
        }*/
        if (typeof(obj[prop]) == 'object'){
            continue;
        }
        if (typeof(obj[prop]) == 'function'){
            continue;
        }
        simpleObject[prop] = obj[prop];
    }
    return JSON.stringify(simpleObject);
}

原始回答:只需使用第二个参数计算递归级别。例如:

function cloneAsObject(obj, level) {
    if (level >= 100 || obj === null || !(obj instanceof Object)) {
        return obj;
    }
    var temp = (obj instanceof Array) ? [] : {};
    for (var key in obj) {
        temp[key] = cloneAsObject(obj[key], level + 1);
    }
    return temp;
}