只查找嵌套数组中的第一个数字
Only finding the first number in a nested array
我目前正在从 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;
}
相关文章:
- 删除第一个数字块之后的所有数字
- Regex-我需要在第一个数字后面拆分一个字符串
- 如何验证文本框,使我不能输入零作为第一个数字
- 如何仅替换第一个数字(用连字符分隔)
- 返回字符串中第一个数字之前出现的所有字母
- (Js)数字方法在第一个数字后添加逗号并删除逗号后的2个数字??有没有
- 仅允许用户更改第一个数字
- 根据属性的第一个数字对数组进行排序
- 只查找嵌套数组中的第一个数字
- JavaScript - 数组仅对第一个字母/仅对第一个数字进行排序
- 在出现的第一个数字时拆分字符串
- 获取 array.length 中的第一个数字
- 用javascript中的regex捕获文本中的第一个数字
- 正则表达式,从字符串中选取第一个数字
- 查找字符串中的第一个数字,后跟 x 个字符数
- 如何设置autoNumeric以接受0作为第一个数字
- 使用javascript从高度变量中移除第一个数字
- 如何使用jquery验证插件防止用户在html输入框中输入0作为第一个数字
- 数组不断删除索引中的第一个数字
- 如果第一个数字是零并且数字大于2位,则替换