我正在进行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;
}
答案 0 :(得分:0)
您没有使用递归调用的值。尝试:
if (typeof(i[a]) === 'object')
{
sum += sumit(i[a]);
}
答案 1 :(得分:0)
让我们来看看你的代码。
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;
}
答案 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;
}