提取任意给定数组中的所有数字,然后将它们全部相加

Pull all numbers in any given array and then add them all together.

本文关键字:然后 全部 数字 任意 数组 提取      更新时间:2023-09-26

我试图提出一个函数,可以采取任何类型的数组(与对象,其他数组,字符串,数字,布尔值等),并拉出所有的数字(即使它们是字符串),然后将它们全部加在一起返回总和。

到目前为止,我试图想出一个函数,首先找到所有的整数,并将它们全部加在一起,然后再担心将任何表示数字的字符串转换为整数并添加它们:

function arraySum(array) {
  // the array could be containing integers, strings, objects and/or arrays like itself.
  // Sum all the integers you find, anywhere in the nest of arrays.
  var sum = 0
  var numArray = []
    for (i=0; i > array.length; i++) {
        if (typeOf array[i] == Number) {
            numArray.push(i);
            for (j=0; j> numArray.length; j++) {
                sum += numArray[j];
                return sum;
            };
        }
    }
}
arraySum([1,2,3,["Here is a string", "67", 67], {key: "55", value: 55}, true, 56]);

我期望sum的返回值是184

sum应该返回306(一旦函数更新为将数字字符串转换为整数)

var a = [1, 2, 3, ["Here is a string", "67", 67], {key: "55", value: 55 }, true, 56];
function arraySum(obj) {
    var sum = 0;
    var num = Number(obj);
    if (typeof obj === 'boolean') {
        return 0;
    }
    if (typeof num === 'number' && !isNaN(num)) {
        return num;
    }
    if (typeof obj !== 'object') {
        return 0;
    }
    if (obj.length) {
        for (var i = 0; i < obj.length; i++) {
            sum += arraySum(obj[i]);
        }
    }
    else {
        for (var p in obj) {
            sum += arraySum(obj[p]);
        }
    }
    return sum;
}
console.log(arraySum(a));

这是jq 1.5 (https://stedolan.github.io/jq/)中的解决方案。作为一个jq程序,它将接受任意JSON输入。由于您的输入不是严格的JSON,下面显示了处理您建议的输入的方法:

# summation_walk scans for numbers or numeric strings
# everywhere except in the key names, and adds them up:
def summation_walk:
  walk( if type == "object" then .[] else . end )
  | walk( if type == "string" then tonumber?
          elif (type | . == "boolean" or . == "null") then empty
          else .
          end )
  | flatten
  | add;
[1,2,3,["Here is a string", "67", 67], {key: "55", value: 55}, true, 56]
| summation_walk

收益率:

306

您正在循环内部进行循环。第一个循环需要找到所有的数字,然后您可以循环并添加填充在第二个数组中的数字:

编辑:修正了你代码中的许多错误,它在这里工作:jsfiddle

function arraySum(arr) {
    var sum=0, numArray=[]; // <==== correct initialisation
    // first, find numbers
    for (var i=0; i<arr.length; i++) {
        if (typeof(arr[i]) === 'number') numArray.push(arr[i]);
    }
    // now we can add numbers
    for (var j=0; j<numArray.length; j++) {
        sum += numArray[j];
    }
    return sum; // <====== put return here [1, 2, 3, 56]
}
var sum = arraySum([1,2,3,["Here is a string", "67", 67], {key: "55", value: 55}, true, 56]);
console.log(sum); // 62