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

Only finding the first number in a nested array

本文关键字:第一个 数字 数组 查找 嵌套      更新时间:2023-09-26

我目前正在从 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; 
}

让我们来看看你的代码。

  • sum变量初始化为 0
  • 在输入数组上调用"帮助程序"函数,并将其返回值分配给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;
}

有三件事是错误的。

这是在评论中解释的修复程序:

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

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

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

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

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

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;

}