新手多维数组加法困境

时间:2015-01-15 16:26:52

标签: javascript arrays multidimensional-array addition

我正在尝试添加一个数组的所有元素,其中嵌入了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));

5 个答案:

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

希望这有帮助。