【问题标题】:Newbie Multidimensional Array Addition Dilemma新手多维数组加法困境
【发布时间】:2015-03-14 03:00:34
【问题描述】:

我正在尝试添加一个数组的所有元素,其中嵌入了 3 个不同长度的其他数组。第三层是两个单元素数组,我不知道如何访问它们的值。我究竟做错了什么?请指教(请不要扔灯)。

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

【问题讨论】:

  • 您需要将第二个for lus 放在for lus j 内。添加这个时刻arr[i][j][k]会产生脚本错误。你在问这个arr[i][undefined][undefined]。您无法从未定义的内容中检索属性。

标签: javascript arrays multidimensional-array addition


【解决方案1】:

解决问题的另一种方法:

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

希望这会有所帮助。

【讨论】:

  • 您正在构建一个全新的阵列只是为了解决这个问题。创建不必要的循环(在不支持Array.prototype.foreach 的浏览器中不起作用)。对于这种情况,接缝非常精细,有点矫枉过正。提示:将 for 循环移到函数中,以便函数返回总和,而不必每次想要总和时都添加 for lus。
【解决方案2】:

这是递归的主要候选者:

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

【讨论】:

  • 我发现我太慢了:)
  • 您正在将 jQuery 引入其中。虽然 OP 没有标记或要求它。请用原生 JavaScript 解决。
  • 显然没有我那么慢,迈克尔。 (咳咳)
  • 为了方便起见,JQuery 只是在页面加载时触发,sumArray() 函数是纯 javascript 并且独立存在,您可以随意调用它。
【解决方案3】:

对已发布问题的说明

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 包含每个数组级别的所有值。

【讨论】:

  • 是的,当它位于 arr[6][5][0] 中时,我无法弄清楚如何访问该值。我喜欢你在 else-if 语句中使用继承,顺便说一句,以及递归。谢谢!
【解决方案4】:

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

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

【讨论】:

  • 这很好!我喜欢使用继承 (Object.prototype.toString.call(...)) 和使用递归。谢谢!
  • @user3743226 - 不是真正的继承,只是一种测试数组的方法,从这里借用:stackoverflow.com/questions/4775722/check-if-object-is-array
  • OIC...顺便说一句,T.J.克劳德的帖子真的很有趣。非常感谢!
【解决方案5】:

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

【讨论】:

  • 不错!这非常简洁(我猜是我的反物质版本)。
猜你喜欢
  • 2013-02-11
  • 1970-01-01
  • 2014-12-26
  • 2015-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-04
  • 1970-01-01
相关资源
最近更新 更多