我试图编写一个递归函数,它根据索引数组在模型中返回正确的嵌套对象。
我的控制台日志标有'内部功能'实际上显示了正确的对象!这让我感到困惑,因为我之后所做的就是返回obj,但函数似乎再次运行并返回父级。
var model = [
{ name: 'Item 1' },
{
name: 'Item 2',
sub: [
{ name: 'Item 2.1' },
{ name: 'Item 2.2' },
{ name: 'Item 2.3' }
]
},
{ name: 'Item 3' },
{ name: 'Item 4' }
];
function getObj(collection, array) {
var data = collection[array[0]];
if(array.length > 1) {
array.shift();
arguments.callee(data.sub, array);
}
console.log('inside function', data);
return data;
}
var obj = getObj(model, [1, 2]); // expecting obj.name === 'Item 2.3'
console.log('result', obj); // obj.name === 'Item 2'
答案 0 :(得分:1)
当你再次递归时
arguments.callee(data.sub, array);
您没有返回结果,而是忽略了结果并从初始调用中返回数据。
尝试向该行添加return
,以便递归调用的结果是整个函数的结果。
另请注意arguments.callee
无法在严格模式下工作。
警告:第5版ECMAScript(ES5)禁止在严格模式下使用arguments.callee()。避免使用
arguments.callee()
通过给函数表达式命名或使用函数声明,函数必须调用它自己。
要在严格模式下工作,您可以
return getObj(data.sub, array);
答案 1 :(得分:0)
你也应该在递归中返回:
function getObj(collection, array) {
var data = collection[array[0]];
if(array.length > 1) {
array.shift();
return arguments.callee(data.sub, array);
}
console.log('inside function', data);
return data;
}