在JavaScript中返回一个数组

3
我受到这个问题的启发,写了一个JavaScript递归函数来添加数组元素并相应地返回数组。

伪代码如下:

arr = [1,2,3,4,5,6]
func (arr,2) = > [1+3+5, 2+4+6]
                 [9,12]
func (arr,3) = > [1+4,2+5,3+6]
                 [5,7,9]

所以我写了一个示例,在这里

var input = [1,2,3,4,5,6,7,8,9];

function tupleAdd(tuple,i,p,t,output){
    if(typeof t == "undefined")
        t=0;
    if(typeof p == "undefined")
        p=0;
    if(typeof output == "undefined")
        output = [];
    if(typeof output[t] =="undefined")
        output[t]=0;

    output[t]+=i[p];
    p++;
    t++;
    t>=tuple?t=0:null;
    if(p<i.length)
        tupleAdd(tuple,i,p,t,output);
    else{
        console.log(output);
        return(output);
    }
}

x = tupleAdd(3,input);
console.log(x);

我的函数正常运行,第一个console.log()显示了正确的值。奇怪的是,当我returnoutput(带或不带括号),并再次尝试记录它时,我得到了undefined

我发现这令人深感不安。有人能解释一下为什么return值与console.log值不同吗?


3
如果在递归调用 tupleAdd() 前添加 return,会导致函数在第一次递归后立即返回并停止执行。这样做可能会使函数无法完整地遍历元组中的所有元素并返回最终结果。 - BenM
1
你觉得用 return tupleAdd(tuple, i, p, t, output) 怎么样? - PSL
3个回答

3

你的递归有问题。由于函数调用内部没有返回,因此您得到了未定义的结果。

tupleAdd(tuple,i,p,t,output);

需要
return tupleAdd(tuple,i,p,t,output);

谢谢!我已经给你和Ben点赞了。我选择了他的回答,因为他先评论了。由于两个答案都同样有帮助且时间相近,我没有更好的标准来做出选择。 - Jason Nichols

2

你需要返回递归调用的值:

var input = [1,2,3,4,5,6,7,8,9];

function tupleAdd(tuple,i,p,t,output){
    if(typeof t == "undefined")
        t=0;
    if(typeof p == "undefined")
        p=0;
    if(typeof output == "undefined")
        output = [];
    if(typeof output[t] =="undefined")
        output[t]=0;

    output[t]+=i[p];
    p++;
    t++;
    t>=tuple?t=0:null;
    if(p<i.length)
        return tupleAdd(tuple,i,p,t,output);
    else{
        console.log(output);
        return(output);
    }
}

x = tupleAdd(3,input);
console.log(x);

-2
function doTuple(arr, tuple){

    if(!arr.length){
        return tuple;
    }

    var el = arr.splice(0,1);

    el % 2 ? tuple.evens += +el : tuple.ods += +el;

    return doTuple(arr, tuple);
}

console.log(doTuple([1,2,3,4,5], {evens:0,ods:0}));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接