【问题标题】:Extracting and Adding Numbers From Array(s)从数组中提取和添加数字
【发布时间】:2015-06-30 09:01:40
【问题描述】:

我正在尝试编写一个函数,该函数将提取和汇总所有整数,无论​​给定数组有多少层(我在这里说的是多维数组)。到目前为止,这是我所得到的:

function addTheNumbers (someArray) {
    var onlyNumbers = someArray.filter(function(a){ return typeof(a)=='number'; });
    for (i = 0; i < onlyNumbers.length; i++) {
        // idk
    }
}
var sampleArray = ['word',['a','b','c'],12314,'longer phrase',5,[123,123,2],10,3874,32];
addTheNumbers(sampleArray);

我有两个担心:

1) 我觉得我的过滤器只会提取给定数组中单独存在的数字,而不是所有数组中的所有数字……不知道如何解决它。

2) 我知道,一旦我提取了所有数字,它们将存储在一个对象/数组中,我必须以某种方式遍历它以将它们全部添加在一起,但是……我又一次不知道该怎么做。

JSFiddle 让事情变得更简单。

【问题讨论】:

  • 如果元素是数组,则递归地应用 addTheNumbers。
  • 您的问题可以描述为两个较小的问题:1)展平数组,2)对元素求和(如果它们是数字)。
  • typeof 不带括号。

标签: javascript arrays function numbers


【解决方案1】:

试试这个。

var temp = [];
function addTheNumbers(someArray) {

	for (var i = 0; i < someArray.length; i++) {
			if(typeof someArray[i] == "number")
			temp.push(someArray[i]);
		else if(typeof someArray[i] == "object"){
			addTheNumbers(someArray[i]);
		}
	};
}


var sampleArray = ['word', ['a', 'b', 'c'], 12314, 'longer phrase', 5, [123, 123, 2], 10, 3874, 32];
addTheNumbers(sampleArray);

【讨论】:

  • 这将为我返回“未定义”。 ://
  • 您将获得“temp”变量中的值
  • 好的,所以我知道someArray 正在“扫描”数字类型,并且值被推送到temp 变量,但是我们在哪里将这些值加在一起呢?
【解决方案2】:
    var number = [];
    function addTheNumbers(someArray) {

        for (var i = 0; i < someArray.length; i++) {
        if(/^-?\d+\.?\d*$/.test(someArray[i])) {
        number.push(someArray[i]);
    }       
    else if(someArray[i] !== null && typeof someArray[i] === 'object'){
                addTheNumbers(someArray[i]);
            }
        };
    }


    var sampleArray = ['word', ['a', 'b', 'c'], 12314, 'longer phrase', 5, [123, 123, 2], 10, 3874, 32];
addTheNumbers(sampleArray);

希望它会有所帮助;)

【讨论】:

    【解决方案3】:

    r()是减少数组的回调。

    var sampleArray = ['word', ['a', 'b', 'c'], 12314, 'longer phrase', 5, [123, [123, 0], 2], 10, 3874, 32];
    function r(res, el) {
        if (typeof el === 'number') {
            res.push(el);
        } else if (Array.isArray(el)) {
            res = res.concat(el.reduce(r, []));
        }
        return res;
    }
    document.write('<pre>' + JSON.stringify(sampleArray.reduce(r, []), null, 4) + '</pre>');

    【讨论】:

      【解决方案4】:

      正如其他答案所说,更简单的方法是递归结构。

      function addTheNumbers(arr) {
          return arr.reduce(function (sum, currentValue) {
              if (currentValue instanceof Array) {
                  return sum + addTheNumbers(currentValue);
              }
              return sum + (typeof currentValue == "number" ? currentValue : 0);
          }, 0);
      }
      var sampleArray = ['word',['a','b','c'],12314,'longer phrase',5,[123,123,2],10,3874,32];
      alert(addTheNumbers(sampleArray)); // returns 16483

      【讨论】:

      • 我得到了除了第 6 行之外的所有内容——尤其是 ?b:0 部分。你能帮我看看吗?
      • 这是一个ternary operator...(条件?真:假)
      猜你喜欢
      • 1970-01-01
      • 2014-06-17
      • 1970-01-01
      • 1970-01-01
      • 2016-06-25
      • 2022-11-21
      • 2021-12-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多