我如何使用递归函数来处理数组?

时间:2015-08-03 13:07:26

标签: javascript

这是源数据。我想使用"你好"在源代码中,找到" up",最后,得到一个数组" [max,min]" (像多棵树,找到根)

var obj = {
    'hello': {

        "up": "world",
        "down": "ccc"
    },
    'world': {

        "up": ["max","min"],
        "down": "hello"
    },
    'max': {

        "up": null,
        "down": "world"
    },
    'min': {

        "up": null,
        "down": "world"
    },
    'ccc': {

        "up": "hello",
        "down": null
    }

}

我使用递归函数,但下面的代码不起作用。它返回" undefined"。 (如果" up"不是数组,则该功能有效。)

function findRoot(source,key){

    var up = source[key]['up'];

    if(up==null){

        return key

    }else{
        if(Object.prototype.toString.call(up)=='[object Array]'){

            up.forEach(function(d){

                return findRoot(source,d);

            })

        }else{

            return findRoot(source,up)
        }

    }
}

如何修复此代码?

2 个答案:

答案 0 :(得分:1)

你不会在你的' if array'中返回任何内容。情况下:

if(Object.prototype.toString.call(up)=='[object Array]'){
    up.forEach(function(d){
        return findRoot(source,d);
    })
    // no return

如果您未指定退货,则JavaScript将默认返回undefined

另请注意,forEach函数不会对从函数返回的值执行任何操作。一种替代方法是使用map函数,然后再次返回该数组:

var results = up.map(function(d) {
    return findRoot(source, d);
});
return array;

然而,这可能也不是您打算做的。由于您的代码唯一的基本情况是当值为null时,您的函数将永远只返回null,或者包含null的数组,而不是有意义的数组。例如,调用findRoot(obj, 'hello');将返回[null, null],这可能不是您想要的。

如果是这种情况,您可能需要重新考虑您的递归函数究竟要做什么+查看添加更多基本案例,或修改现有基础和递归案例。

答案 1 :(得分:0)

问题是你在forEach()循环中的匿名函数内部返回,但实际上没有为findRoot()返回任何内容,所以默认情况下它会返回undefined

up.forEach(function(d){
    return findRoot(source,d);//doesn't return for **findRoot()** just for anonymous function.
});

如果有多个根节点,则可以返回根节点数组。您可以将返回值推送到array,然后返回数组。如果不超过一个,你可以像往常一样返回。这是一个例子:

function findRoot(source,key){
    var up = source[key]['up'];

    if(up==null){

        return key

    }else{
        if(Object.prototype.toString.call(up)=='[object Array]'){
            var temp = new Array();
            up.forEach(function(d){
                temp.push(findRoot(source,d));
            });
            return temp;
        }else{

            return findRoot(source,up)
        }

    }
}

如果您有一个数组,它将返回如下:

enter image description here

如果您没有数组,它将返回如下:

enter image description here

然后,您可以检查返回是否为数组,并执行返回所需的操作。另一种选择是始终返回一个数组,如果只有一个元素,则数组中只有一个元素。