新手多维数组加法困境

Newbie Multidimensional Array Addition Dilemma

本文关键字:困境 数组 新手      更新时间:2023-09-26

我正在尝试添加嵌入其他 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));

让我们使用 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));

这应该在你遍历时检查一个数组,然后递归地总结它们。 请注意,此示例代码需要整数。

  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));

对已发布问题的解释

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 个循环,你需要单手编写。此函数循环遍历数组的值,并在找到数字时返回总和。如果找到数组对象,则函数将再次调用自身,但当前数组对象除外。返回的结果将存储到总和中。当函数最终返回到第一个函数调用时; sum包含每个数组级别的所有值。

这是递归的主要候选者:

<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"/>

解决问题的另一种方法:

 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);

希望这有帮助。

截至 2019 年,使用 reduce 的答案已被弃用(或者至少有更好的解决方案来解决它)。使用 Array.flat() 方法来"展平"数组并获取它的长度:

var matrix = [1, 2, 3, 4, 5, [6, 7, 8, [9], [10]]];
// this will return you 10
console.log("Length of multidimensional array items: " matrix.flat().length)