仅查找嵌套数组中的第一个数字

时间:2013-10-03 15:49:46

标签: javascript arrays

我正在进行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 个答案:

答案 0 :(得分:0)

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

if (typeof(i[a]) === 'object')
{
    sum += sumit(i[a]);
}

答案 1 :(得分:0)

让我们来看看你的代码。

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

看看这段代码,它没有理由不适用于整数数组。但是,对于子阵列,您完全放弃了结果...如果您将其识别为数组,则不是。相反它也是演员。另外,拥有一个单独的函数是没有意义的,因为你在“main”函数中所做的只是调用它并返回它的返回值。

尝试这样的事情:

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

答案 2 :(得分: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指出的那样,你需要继续添加'sum'。

注意:我在节点中使用这些调用

测试了此解决方案
var ar = [1,1,[1,1,1,1,1],1,1,1];
console.log(sumit(ar));  //should print  10

关于检查数组: Check if object is array?

答案 3 :(得分: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;

}