0

我目前正在从http://toys.usvsth3m.com/javascript-under-pressure/进行 javascript 练习,而我的代码不适用于嵌套数组...我正在尝试使用递归来解决问题,但它似乎只是在嵌套数组的情况下添加第一个元素......我来自 Ruby 背景,所以 javascript 对我来说有点陌生。

如果有人能指出我做错了什么,我将不胜感激!

谢谢, 斯密蒂

function arraySum(i) {

// i will be an array, containing integers and/or arrays like itself.
// Sum all the integers you find, anywhere in the nest of arrays.
var sum = 0;
sum = sumit(i);

return sum;
}

function sumit(i) {
var sum = 0;
for (a=0; a<i.length; a++)
{
    if (typeof(i[a]) == 'array')
    {
        sumit(i[a]);
    }
    else
    {
    sum += parseInt(i[a]);
    }
}
return sum; 
}
4

4 回答 4

0

您没有使用递归调用的值。尝试:

if (typeof(i[a]) === 'object')
{
    sum += sumit(i[a]);
}
于 2013-10-03T15:56:27.593 回答
0

让我们看一下您的代码。

  • sum将变量初始化为 0
  • 在输入数组上调用“助手”函数,并将其返回值分配给sum
    • 您的“助手”函数初始化另一个变量,该变量恰好也被调用sum为零 - 但重要的是要注意它不是同一个变量。为清楚起见,我将其称为sum2.
    • 对于数组中的每个项目...
      • 如果它是数组类型,则在此数组上调用辅助函数,但不对其返回值执行任何操作 - 错误:数组将其类型返回为“对象”。
      • 否则,将其转换为整数并将其添加到sum2
    • 返回sum2
  • 返回sum

查看这段代码,它没有理由不适用于整数数组。但是,对于子数组,您将完全丢弃结果......如果您将其标识为数组,那么您不是。相反,它也被铸造了。此外,拥有一个单独的函数是没有意义的,因为你在“主”函数中所做的只是调用它并返回它的返回值。

尝试这样的事情:

function sum(arr) {
    function recurse(total,curr) {
        if( curr.constructor === Array) return total+sum(curr);
        return total+parseInt(curr,10);
    }
    if( arr.reduce) return arr.reduce(recurse,0);
    // fallback for older browsers that don't support "reduce"
    for( var i=0, l=arr.length, total=0; i<l; i++) total = recurse(total,curr);
    return total;
}

替代解决方案,在较旧的 IE 中未经测试,但假设一个合理的最新浏览器应该没问题:

function sum(arr) {
    arr = arr.concat.apply([],arr); // flatten the array
    for( var i=0, l=arr.length, total=0; i<l; i++) total += parseInt(arr[i],10);
    return total;
}
于 2013-10-03T15:58:14.750 回答
0

有三件事是错误的。

以下是评论中解释的修复:

function sumit(i) {
var sum = 0;
//You need to declare a, or else it puts it in the global scope.
var a;
for (a=0; a<i.length; a++) {  //as a stylistic point, don't put { on a new line.
    //check for array by seeing if it has a length property
    if (i[a].length !== undefined) {
        //add to sum
        sum+= sumit(i[a]);
    }
    else {
        sum += parseInt(i[a]);
    }
}
return sum; 
}

首先,当你使用for(a = 0; . . .的声明是在全局范围内。

其次,检查数组上的 typeof 并不总是有效,但所有数组都有一个 .length

第三,正如 tlrobrn 所指出的,您需要继续添加到“总和”。

注意:我用这些调用在节点中测试了这个解决方案

var ar = [1,1,[1,1,1,1,1],1,1,1];
console.log(sumit(ar));  //should print  10

关于检查数组: 检查对象是否为数组?

于 2013-10-03T16:03:55.763 回答
0

我的代码在我的测试中更短,检查一下

function arraySum(i) {

var sum = 0 ; 

for ( var a in i ) {
    if ( typeof i[a] === 'object' ) { // if it is an array or object, typeof will return 'object'
        return sum + arraySum ( i[a] ) ; // recursive call
    } else if ( typeof i[a] === 'number' ) { // if it is a number, just sum it 
        sum = sum + i[a]
    }
}

return sum;

}

于 2015-06-11T13:34:12.637 回答