使用递归在Array中添加数字并忽略任何其他数据类型

时间:2017-03-14 15:44:06

标签: javascript recursion

请原谅我,如果这是基本的或已经被问过,但我坚持这个问题,我觉得它一定是简单的,我没有看到。

我想使用递归(完成!)添加数组中的所有数字,并且我缺少一个语句来忽略所有其他类型的值。 例如:

var arr = [1,'a','b',2,[1],'c']
sumValues(arr) // => 4 . 

function sumValues(arr){
  if(arr.length === 0){
    return 0;
  } // if the array is empty
  if(arr.length > 0){
    if(Array.isArray(arr[0])){
      return sumValues(arr[0]);
    } // if the next element is an array
    return arr.shift() + sumValues(arr);
  }
}

3 个答案:

答案 0 :(得分:2)

您可以使用Sheets("ABC").Select i = Worksheets("ABC").Range("C2").Value + 1 Do Until Cells(i - 1, 5).Value >= Worksheets("ABC").Range("C5").Value Cells(i, 5).Value = Cells(i - 1, 5).Value + 0.01 i = i + 1 Loop 来确定变量是否是Number.isFinite(value)NaN以外的数字。

根据此测试,检查并有条件地将值添加到求和中。

Infinity

答案 1 :(得分:0)

您可以使用isNaN()来测试某些内容是否为数字。 通过使用布尔反转运算符!,您可以测试它是否为数字: !isNaN(variable)

基本上它说:如果变量不是数字
双重否定是正数,因此它变为:如果变量是数字

function sumValues(arr){
  if(Array.isArray(arr)) {
     if(arr.length > 0) {
       // Get the first value and remove it from the array.
       var first = arr.shift();
       
       // Test if it's numeric.
       if(!isNaN(first)) {
          // If it is, parse the value, add the rest resulting array values.
          return parseInt(first) + parseInt(sumValues(arr));
       }
       // if the first item is an array, we need to iterate that one too.
       if(Array.isArray(first)) {
          return parseInt(sumValues(first)) + parseInt(sumValues(arr));
       }
       // It isn't a number, just continue with what's left of the array.
       return parseInt(sumValues(arr));
     }
     // The array is empty, return 0.
     return 0;
  }
  // It isn't an array
  else {
    // Is it an number?
    if(!isNaN(arr)) {
       // return the number
       return parseInt(arr);
    }
    // return 0, it's a dead end.
    return 0;
  }
}
var arr = [1,'a','b',2,[1],'c'];
console.log(sumValues(arr)) // => 4 .

arr = [1,'3','b',2,[1,[4,3]],'c'];
console.log(sumValues(arr)) // => 14 .

arr = 'foobar';
console.log(sumValues(arr)) // => 0 .

arr = '10';
console.log(sumValues(arr)) // => 10 .

arr = ['foobar',10,'20',[10,20,'foobar']];
console.log(sumValues(arr)) // => 60 .

答案 2 :(得分:0)

您正在挤压数组,无需创建自己的缩减功能。使用Array#reduce压缩数组。每次迭代时,检查当前元素是否为数字;如果是,将其添加到累加器;如果没有,继续前进。

使其递归(如下例所示)检查当前元素是否为数组;如果是,则将元素上的函数调用结果添加到累加器。



const input = [1,'a','b',2,[1],'c'];

const sumValues = i => 
  i.reduce((m, e) => m + (e instanceof Array ? sumValues(e) : (isNaN(e) ? 0 : e)), 0);

console.log(sumValues(input));