js递归函数没有返回正确的子对象

时间:2015-06-19 15:09:54

标签: javascript recursion

我试图编写一个递归函数,它根据索引数组在模型中返回正确的嵌套对象。

我的控制台日志标有'内部功能'实际上显示了正确的对象!这让我感到困惑,因为我之后所做的就是返回obj,但函数似乎再次运行并返回父级。

JSFiddle

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'

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;
}