对多维数组javascript中的所有整数求和
Posted
技术标签:
【中文标题】对多维数组javascript中的所有整数求和【英文标题】:Sum all integers in a multidimensional array javascript 【发布时间】:2016-02-13 09:51:11 【问题描述】:假设我有这个:
function arrSum()
*code here*
如何编写 arrSum 函数,以便它可以对多维数组(可变深度)中的所有整数求和。
即
arrSum([2, 5, [4, 6], 5]) === 22;
我知道在某个地方一定有答案,但我真的找不到。如果这是重复的,请告诉我。
【问题讨论】:
有一个 anwser 但使用 ES6:***.com/a/33306533/5388620 与下面的答案几乎相同,并且也使用递归。 【参考方案1】:你可以简单地用递归编写这样的函数
function arrSum(arr)
var sum = 0;
// iterate array using forEach, better to use for loop since it have higher performance
arr.forEach(function(v)
// checking array element is an array
if (typeof v == 'object')
// if array then getting sum it's element (recursion)
sum += arrSum(v);
else
// else adding the value with sum
sum += v
)
// returning the result
return sum;
console.log(arrSum([2, 5, [4, 6], 5]) === 22);
使用for
循环
function arrSum(arr)
var sum = 0;
for (var i = 0; i < arr.length; i++)
if (typeof arr[i] == 'object')
sum += arrSum(arr[i]);
else
sum += arr[i];
return sum;
console.log(arrSum([2, 5, [4, 6], 5]) === 22);
【讨论】:
这很好用 - 谢谢。我可以问一下 - 你为什么要测试 typeof 对象? @VoA : 检查内部元素是array
或number
, developer.mozilla.org/en-US/docs/Web/javascript/Reference/…
我只需将 isObject 检查移到 foreach
之前,这样,发送单个数字,它仍然可以工作。
在您的 for 循环答案中,您写道:“sum += arrSum(arr[i]);”。你能解释一下这是做什么的吗?它是从自身内部调用 arrSum 函数吗?
@VoA :使用内部数组(递归)调用相同的函数,并使用sum
变量添加返回值【参考方案2】:
检查一下:
function arrSum(objArr)
var total = 0;
for(var outerLoop=0; outerLoop < objArr.length; outerLoop++)
if(objArr[outerLoop].constructor === Array)
for(var innerLoop=0; innerLoop < objArr[outerLoop].length; innerLoop++)
total += objArr[outerLoop][innerLoop];
else
total += objArr[outerLoop];
return total;
alert (arrSum([2, 5, [4, 6], 5]));
【讨论】:
OP 表示可变数组深度。这只会深入两层。【参考方案3】:我将构建一个类似于 Pranav C Balan 的函数,不同之处在于我会在调用 forEach()
之前检查 isObject()
,
这样我就可以解决发送单个 numeric
参数或Null
值所带来的问题。
function arrSum(v)
// checking if element is an array
if (typeof v == 'object')
var sum = 0;
// iterate array using forEach, better to use for loop since it have higher performance
v.forEach(function(e)
sum+=arrSum(e);
);
return sum;
else
return v;
$('body').append($('<p></p>').html('[2, 5, [4, 6], 5] = ' + arrSum([2, 5, [4, 6], 5])));
$('body').append($('<p></p>').html('[2,, 5] = ' + arrSum([2,, 5])));
$('body').append($('<p></p>').html('5 = ' + arrSum(5)));
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
【讨论】:
【参考方案4】: function arrSum(arr)
var totalSum = null;
var numString = arr.toString();
var numberArray = numString.split(",");
numberArray.forEach(function(ele)
totalSum = totalSum + parseInt(ele);
);
return totalSum;
console.log(arrSum([2, 5, [4, 6], 5]);
【讨论】:
【参考方案5】:如果我们有一个包含字符串和整数的多维数组,并且我们必须得到数字的总和,那么按照@Pranav C Balan 的解决方案,我们可以在 else 循环中添加一个检查以仅检查数字,如下所示 -
function arrSum(arr)
var sum = 0;
for (var i = 0; i < arr.length; i++)
if (typeof arr[i] == 'object')
sum += arrSum(arr[i]);
else if (Number(arr[i]))
sum += arr[i];
return sum;
console.log(arrSum([2, 'a', 5, [4, 6, 10, [1, 2, 'b'], 10], 5]));
【讨论】:
【参考方案6】:使用.reduce()
的更现代的方法:
const arr = [2, 5, [4, 6], 5];
const arrSum = array =>
array.reduce(
(sum, num) => sum + (Array.isArray(num) ? arrSum(num) : num * 1),
0
);
console.log(arrSum(arr));
【讨论】:
【参考方案7】:这可以通过 lodash _.flattenDeep
和 _.sum
来完成:
var arr = [2, 5, [4, 6], 5];
arrSum(arr);
function arrSum(arr)
var arrFlattens = _.flattenDeep(arr);
// => [2, 5, 4, 6, 5]
console.log(_.sum(arrFlattens));
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>
【讨论】:
【参考方案8】:为什么没有人使用flat()
?
const arr = [2, 5, [4, 6], 5];
const result = arr.flat().reduce((a,b) => a+b);
console.log(result);
【讨论】:
以上是关于对多维数组javascript中的所有整数求和的主要内容,如果未能解决你的问题,请参考以下文章
javascript es6 多维数组对象相同属性值{key:value}的求和
javascript es6 多维数组对象相同属性值{key:value}的求和