arr
将是一个数组,包含整数,字符串和/或数组本身。将所有整数求和,在数组嵌套中的任何位置。
这是我提出的,但仍然不对
function arraySum(arr) {
var sum = 0;
var sum1 = 0;
for (var i = 0; i < arr.length; i++) {
if (arr[i] === Math.round(arr[i])) { //check if its an integar
sum += arr[i];
}
if (arr[i] instanceof Array) {
for (var n = 0; n < arr[i].length; n++) {
sum1 += arr[i][n];
}
}
}
console.log(sum + sum1);
}
var sumArr = [[[[[[[[[1]]]]]]]], 1]; // => 101. SHOULD BE 2
arraySum(sumArr);
答案 0 :(得分:4)
递归使用reduce
怎么样?
function arrSum(arr) {
return arr.reduce(function fn(a, b) {
if (Array.isArray(b)) {
return b.reduce(fn, a);
} else if (b === Math.round(b)) {
return a + b;
}
return a;
}, 0);
}
reduce()方法对累加器和每个都应用一个函数 数组的值(从左到右)必须将其减少为单个 值。
答案 1 :(得分:3)
function add(array){
return(array+"").match(/-?\d+(?:\.\d+)?/g).reduce(function(a,b) {
return +a+ +b;
});
}
使用正则表达式来解析字符串化数组,但它应该可以正常工作。
那么就会有一个只有数字的数组。这些被解析为.reduce()
,添加它们。我能想到的最好:)
帮助来自:mdn
function add(n){return JSON.stringify(n).match(/[^\D]+/g).reduce(function(n,r){return 1*n+1*r})}
来自http://jscompress.com
速度:0.04395800351630896s 比其他答案快11%,或者我的数学很糟糕
更受支持的答案:
function add (array) {
var nums = JSON.stringify(array).match(/[\d\-]+/g),
i,
sum = 0;
for (i = 0; i < nums.length; i += 1) {
sum += parseInt(nums[i], 10);
}
return sum;
}
答案 2 :(得分:3)
function arraySum(arr) {
var sum = 0;
for (var i = 0; i < arr.length; i++) {
if (arr[i] instanceof Array) { sum += arraySum(arr[i]);}
if (arr[i] === Math.round(arr[i])) {sum += arr[i];}
}
return sum;
}
答案 3 :(得分:1)
您可以使用递归函数解决此问题,尝试使用以下内容:
function arraySum(arr) {
var sum = 0;
for (var i = 0; i < arr.length; i++) {
if (arr[i] === Math.round(arr[i])) {
sum += arr[i];
}
if (arr[i] instanceof Array) {
sum += arraySum(arr[i]); //This will apply the same function to the current Array element which is an Array
}
}
return sum; //To have the sum of the actual Array
}
var sumArr = [[[[[[[[[1]]]]]]]], 1];
console.log(arraySum(sumArr)); //now it returns 2
答案 4 :(得分:0)
试试这个:
function arraySum(arr) {
return arr.reduce(function(s, n) {
return s + ((n instanceof Array) ? arraySum(n) : +n || 0);
}, 0);
}
+n
尝试将字符串转换为整数,如果+n
产生NaN
,则默认为零。
答案 5 :(得分:0)
这是不依赖迭代的解决方案:
var arraySum = function(array) {
if (array.length === 0) {
return 0;
}
var rest = array.slice();
var next = rest.pop();
if (next instanceof Array) {
return arraySum(next) + arraySum(rest);
} else {
return next + arraySum(rest);
}
};
答案 6 :(得分:0)
任何值v
和more
的总和为-
v
,请返回空值0
v
。如果该值为数组,则返回v
的总和加上more
的总和v
不是数组。返回v
的数值加上more
的总和
const sum = ([ v, ...more ]) =>
v === undefined
? 0 // 1
: Array.isArray(v)
? sum(v) + sum(more) // 2
: Number(v) + sum(more) // 3
const result =
sum([[[[[[[[[1]]]]]]]], 1])
console.log(result)
// 2