Javascript无限嵌套数组处理

mmr*_*151 2 javascript algorithm recursion nested multidimensional-array

我正试图和我的伙伴一起玩,他解决了8m 7s中提到的问题,对我来说已经有20米了.我无法弄清楚如何在javascript中处理无限制的嵌套数组.

问题是这样的:

// i will be an array, containing integers, strings and/or arrays like itself.
// Sum all the integers you find, anywhere in the nest of arrays.
Run Code Online (Sandbox Code Playgroud)

所以

arraySum([[1,2,false],'4','5']) will return 3 (passed)
arraySum([[1,2,3],4,5]) will return 15 (passed)
arraySum([[[[[[[[[1]]]]]]]], 1]) will return 2 (failed)
Run Code Online (Sandbox Code Playgroud)

我写的代码是:

function arraySum(i) {

sum = 0;
tmp =0;
for (var a=0; a<i.length; a++){
    if (i[a] instanceof Array) {
        ar = i[a];
        for (var j=0; j<ar.length; j++){
            tmp +=ar[j];
        }
    }
    if (typeof i[a] == "number")
        sum += i[a];
        console.log(sum);
}
return sum + tmp;
Run Code Online (Sandbox Code Playgroud)

}

正如你所看到的,它无法处理我失败的最后一种情况,因为我无法弄清楚如何在JS中处理无限的嵌套.

任何想法将不胜感激.也试着在8m 7s之前完成它,我的好友完成了.

Ian*_*Ian 16

if (i[a] instanceof Array) {部件内部,您将不得不使用递归来操作具有相同arraySum功能的嵌套数组,而不仅仅是使用另一个循环.试试这个:

var arraySum = (function () {
    "use strict";

    var sumFunc, isArray;

    sumFunc = function (arr) {
        var sum, i, j, cur, toAdd;

        sum = 0;

        for (i = 0, j = arr.length; i < j; i++) {
            cur = arr[i];

            toAdd = 0;
            if (isArray(cur)) {
                toAdd = sumFunc(cur);
            } else if (typeof cur === "number") {
                toAdd = cur;
            }

            sum += toAdd;
        }

        return sum;
    };

    isArray = Array.isArray || function (obj) {
        return Object.prototype.toString.call(obj) === "[object Array]";
    };

    return sumFunc;
}());
Run Code Online (Sandbox Code Playgroud)

演示: http ://jsfiddle.net/Q7JPM/1

该函数只循环遍历数组中的所有项,并返回内部找到的任何数字的总和.如果该项本身是一个数组,则调用arraySum并传递该数组...将结果添加到总和中.如果它是一个数字,它只是将其加到总和上.