我尝试找到嵌套数组的所有数字的总和,但我没有让它正常工作。这就是我试过的:
function arraySum(i) {
sum=0;
for(a=0;a<i.length;a++){
if(typeof i[a]=="number"){
sum+=i[a];
}else if(i[a] instanceof Array){
sum+=arraySum(i[a]);
}
}
return sum;
}
有人知道哪里有错误吗? 当您使用数组[[1,2,3],4,5]进行尝试时,它会得到6作为答案,而不是15.我不知道为什么。
答案 0 :(得分:7)
您的代码存在的问题是sum
和a
变量是全局的,而不是本地的。因此,您将获得无限循环(函数中的第一个条目将由第二个条目重置,因此将再次处理相同的元素。)
通过将var
添加到声明sum
和a
的位置来修复它,使其成为函数的本地:
function arraySum(i) {
var sum=0; // missing var added
for(var a=0;a<i.length;a++){ // missing var added
if(typeof i[a]=="number"){
sum+=i[a];
}else if(i[a] instanceof Array){
sum+=arraySum(i[a]);
}
}
return sum;
}
答案 1 :(得分:0)
你错过了两个var
。您已在窗口范围内隐式声明sum
和a
:
function arraySum(i) {
**var** sum=0;
for(**var** a=0;a<i.length;a++){
if(typeof i[a]=="number"){
sum+=i[a];
}else if(i[a] instanceof Array){
sum+=arraySum(i[a]);
}
}
return sum;
}
答案 2 :(得分:0)
递归,例如
function arraySum(x) {
var sum = 0, i;
if (typeof x === 'number')
return x;
else if (x instanceof Array)
for (i = 0; i < x.length; ++i)
sum += arraySum(x[i]);
return sum;
}
arraySum([[1,2,3],4,5]); // 15
我没有对此进行优化,因此很明显,在递归之前您可能需要更多逻辑。
您的工作不起作用的原因是您需要var
sum
和a
。
答案 3 :(得分:0)
首先,为什么你使用'i'作为功能的输入?我们使用'i'来表示运行索引.. 关于你的问题,你希望'a'在你的循环中是本地的,而不是“for(a = 0; ...”而不是写“for(var a = 0;”
<html>
<body>
<script>
function NestedArraySummation(arr)
{
var sum=0;
for(var i=0;i<arr.length;i++)
{
if(typeof arr[i]=="number")
sum=sum+arr[i];
else if(arr[i] instanceof Array)
sum=sum+NestedArraySummation(arr[i]);
}
return sum;
}
var MyArray=[1,[2,3],4,10,[1,2]];
var Sum=NestedArraySummation(MyArray);
document.write(Sum);
</script>
</body>
</html>
答案 4 :(得分:0)
对于2018年,此解决方案既干净又实用:
let arr = [[1,2,3],4,5]
arr.flat().reduce((accumulator,currentValue)=>accumulator+currentValue)
答案 5 :(得分:0)
这可以通过lodash _.flattenDeep
和_.sum
完成:
const arr = [[1, 2, 3], 4, 5];
arraySum(arr);
function arraySum(arr) {
var arrFlattens = _.flattenDeep(arr);
// => [1, 2, 3, 4, 5]
console.log(_.sum(arrFlattens));
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>
答案 6 :(得分:0)
我知道已经晚了,但是他们说“从不迟到”:)
const sumNestedArray = arr => arr.flat(Infinity).reduce((a,b)=> a+b, 0)
const sumNestedArray = arr => arr.flat(Infinity).reduce((a,b)=> a+b, 0)
console.log(sumNestedArray([1,[2], [2, 3, [4]]]))
sumNestedArray([1,[2], [2, 3, [4]]])
答案 7 :(得分:0)
给你:
(我的假设是您想将字符串(例如“13”)解析为数字,以便将它们包含在总和中。如果不是,只需将 isNumber
更改为 typeof val === 'number'
。
function arraySum(arr) {
let sum = 0;
while (arr.length) {
const val = arr.pop();
const isArray = typeof val === 'object' && val.length !== undefined;
const isNumber = !isArray && !isNaN(sum + parseFloat(val));
if (isArray && val.length) {
sum += arraySum(val);
}
else if (isNumber) {
sum += parseFloat(val);
}
}
return sum;
}
console.log(arraySum([])); //0
console.log(arraySum([1, 1, 1, [3, 4, [8]], [4]])); //22
console.log(arraySum([1, 1, [], {}, 'l', 1, [3, 4, [8]], [4]])); //22
答案 8 :(得分:-1)
from __builtin__ import int
def nestedLists(mylist):
sum = 0
if checkIfAllInt(mylist):
result = addList(mylist)
return result
else:
for value in mylist:
sum = sum + nestedLists(value)
return sum
def addList(listdata):
if(type(listdata) is int):
return listdata
else:
return sum(listdata)
def checkIfAllInt(listdata):
check = True
if(type(listdata) is int):
return check
else:
for value in listdata:
if(not type(value) is int):
check = False
return check
return check
print nestedLists([1,[2,3,[4,5,[6,7]]]])