我在下面的代码中有一个主要缺陷。每次递归工作(即函数被多次调用)时,由于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;
}
答案 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);