我正在尝试添加一个数组的所有元素,其中嵌入了3个不同长度的其他数组。在第三级是两个1元素数组,其值我无法弄清楚如何访问。我究竟做错了什么?请告知(请不要投灯)。
function addArrayElems(arr) {
var sum = 0;
for (var i = 0; i < arr.length; i++) {
if (typeof arr[i] === "number") sum += arr[i];
for (var j = 0; j < arr.length; j++) {
if (typeof arr[i][j] === "number") sum += arr[i][j];
}
//arr[i][j][k] doesn't work
for (var k = 0; k < arr.length; k++) {
if (typeof arr[i][j][k] === "number") sum += arr[i][j][k];
}
for (var l = 0; l < arr.length; l++) {
if (typeof arr[i][j] === "number") sum += arr[i][j];
}
}
return sum;
}
var arr = [1, 2, 3, 4, 5, [6, 7, 8, [9], [10]]];
console.log(addArrayElems(arr));
答案 0 :(得分:0)
让我们使用reduce
!
function addArrayElems(arr) {
return arr.reduce(function(memo, item){
if (typeof item !== "number") {
return memo + addArrayElems(item);
}
return memo + item;
}, 0);
}
var arr = [1, 2, 3, 4, 5, [6, 7, 8, [9], [10]]];
console.log(addArrayElems(arr));
答案 1 :(得分:0)
已发布问题的说明
function addArrayElems(arr) {
var sum = 0;
for (var i = 0; i < arr.length; i++) {
if (typeof arr[i] === "number") sum += arr[i];
for (var j = 0; j < arr.length; j++) {
if (typeof arr[i][j] === "number") sum += arr[i][j];
//added this line here. If arr[i][j] is defined and [i][j][0] return sum.
if (arr[i][j] && typeof arr[i][j][0] === "number") sum += arr[i][j][0];
}
for (var l = 0; l < arr.length; l++) {
if (typeof arr[i][j] === "number") sum += arr[i][j];
}
}
return sum;
}
var arr = [1, 2, 3, 4, 5, [6, 7, 8, [9], [10]]];
console.log(addArrayElems(arr));
在您自己的代码中,您遍历父数组arr
。当您访问arr[i]
时,这将始终有效。如果设置,JavaScript将返回一个值,否则返回undefined
。但是,当您尝试访问非属性(undefined
)上的属性时,这将返回脚本错误。你不能要求一个不存在的物体的颜色。上面的代码应根据您提供的样本返回所需的结果(因为第三级数组的长度仅为1)。上面的例子只是解释了如何访问多维数组中的值。但是,您希望以递归方式执行此操作。我将在下面给你举一个例子:
改进答案(http://jsfiddle.net/o80e7f53/)
function addArrayElems(arr) {
var sum = 0;
for (var i = 0; i < arr.length; i++) {
if (typeof arr[i] === "number")
{
sum += parseInt(arr[i]); //parse number and add to sum.
}
else if (Object.prototype.toString.call(arr[i]) === '[object Array]')
{
sum += addArrayElems(arr[i]);
}
}
return sum;
}
var arr = [1, 2, 3, 4, 5, [6, 7, 8, [9], [10]]];
console.log(addArrayElems(arr));
递归函数再次调用自身。基本上如果你的多维数组是100个数组深,这个函数仍然会返回所有值。在你的方法中,这需要100个for循环,你需要单独编写。此函数循环遍历数组的值,并在找到数字时返回总和。如果找到一个数组对象,该函数将再次调用自身,除了当前数组对象。返回的结果存储为sum。当函数最终返回第一个函数调用时; sum
包含每个数组级别的所有值。
答案 2 :(得分:0)
这应该在您迭代时检查数组,然后递归地求它们。请注意,此示例代码需要整数。
function getSumOfArray(arr) {
var sum = 0;
for (var i = 0; i < arr.length; i++) {
//Check for array
if( Object.prototype.toString.call( arr[i] ) === '[object Array]' ) {
sum += getSumOfArray(arr[i]);
} else {
sum += parseInt(arr[i], 10);
}
}
return sum;
}
var arr = [1, 2, 3, 4, 5, [6, 7, 8, [9], [10]]];
alert(getSumOfArray(arr));
答案 3 :(得分:0)
这是递归的主要候选者:
<script type="text/javascript">
$(function () {
var arr = [1, 2, 3, 4, 5, [6, 7, 8, [9], [10]]];
var sum = sumArray(arr);
alert(sum);
});
function sumArray(value) {
var sum = 0;
if (value == null) {
return 0;
}
//Base Case
if (typeof value == "number") {
return value;
}
else
//It must be an array
{
value.forEach(function (arrayItem) {
sum += sumArray(arrayItem);
});
}
return sum;
}
</script>
修改强>
要求在没有JQuery的情况下解决这个问题。功能仍然相同:
<script type="text/javascript">
function onClick() {
var arr = [1, 2, 3, 4, 5, [6, 7, 8, [9], [10]]];
var sum = sumArray(arr);
alert(sum);
};
function sumArray(value) {
var sum = 0;
if (value == null) {
return 0;
}
//Base Case
if (typeof value == "number") {
return value;
}
else
//It must be an array
{
value.forEach(function (arrayItem) {
sum += sumArray(arrayItem);
});
}
return sum;
}
</script>
可以调用此函数,但是,例如,我使用的是没有JQuery的HTML输入。
<input type="button" onClick="onClick()" value="Click ME"/>
答案 4 :(得分:0)
解决问题的另一种方法:
var arr = [1, 2, 3, 4, 5, [6, 7, 8, [9], [10]]];
//此函数将所有给定的数组合并在一起并展平合并的数组。
function merge_array(){
var newArray = [];
var allArray = Array.prototype.concat.apply([],arguments);
for(var e=0; e <allArray.length; e++){
var ele = allArray[e];
if(ele.__proto__.constructor === Array){
newArray = newArray.concat(merge_array(ele));
}
else{
newArray.push(ele);
}
}
return newArray;
}
//最后只需将所有数字元素相加:
var singleArray = merge_array(arr);
var sum = 0;
for(var i=0; i<singleArray.length; i++){
sum+=singleArray[i];
}
console.log('sum: ',sum);
希望这有帮助。