使用递归从函数返回数组的最佳方法是什么

时间:2015-10-28 18:28:57

标签: javascript algorithm recursion

我在下面的代码中有一个主要缺陷。每次递归工作(即函数被多次调用)时,由于var result = []表达式,它会覆盖数组。那么,为了避免这种情况,最好的方法是什么。我真的不想把结果变量放在函数的范围之外。我正在寻找的是最佳实践和更好的方法。

function getElementNames(obj){
    //below line overwrites the previous result every time this function runs
    var result = [];
    if(!obj.parent){
        result.push(obj.name);
    }
    else {
        result.push(obj.name);
        getElementNames(obj['parent'])
    }
    return result;
}

2 个答案:

答案 0 :(得分:5)

也许你会改变整个结构。我建议在必要时返回一个数组和concat。

function getElementNames(obj) {
    var result = [obj.name];
    if (obj.parent) {
        result = result.concat(getElementNames(obj.parent));
    }
    return result;
}

答案 1 :(得分:1)

尝试使用相同的 result

function getElementNames(obj, result){
    // This lines creates the first array, no need to pass it in the function call
    if (!result) {
        result = [];
    }

    if(!obj.parent){
        result.push(obj.name);
    }
    else {
        result.push(obj.name);
        getElementNames(obj['parent'], result)
    }
    return result;
}

因此,所有功能级别都管理在引用开始时创建的result

示例:



function getElementNames(obj, result){
    // This lines creates the first array, no need to pass it in the function call
    if (!result) {
        result = [];
    }

    if(!obj.parent){
        result.push(obj.name);
    }
    else {
        result.push(obj.name);
        getElementNames(obj['parent'], result)
    }
    
    return result;
};

var el = {
    name: "Element 1",
    parent: {
        name: "Element 2",
        parent: {
            name: "Element 3"
        }
    }
};

var r = getElementNames(el);
console.log(r);