Javascript 如何在嵌套数组中添加数字

Javascript 如何在嵌套数组中添加数字,javascript,logic,Javascript,Logic,只是在做一个项目,尝试了一些不同的解决方案,但没有结果。有人能帮我把嵌套数组中的数字相加吗?我会使用reduce吗?还是一个循环 function balance(arr) { if(typeof item == 'number') { return arr;enter code here } else { return arr + balance(item); } } 这可能是你所希望的吗 function balance(arr) { return arr.

只是在做一个项目,尝试了一些不同的解决方案,但没有结果。有人能帮我把嵌套数组中的数字相加吗?我会使用reduce吗?还是一个循环

function balance(arr) {
  if(typeof item == 'number') {
    return arr;enter code here
  } else {
    return arr + balance(item);
  }
}

这可能是你所希望的吗

function balance(arr) {
  return arr.reduce(function(sum, item) {
    if(typeof item == 'number') {
      return sum;
    } else {
      return sum + balance(item);
    }
  },0);
}

console.log(balance([1,2,[3,4],5]));

这可能是你所希望的吗

function balance(arr) {
  return arr.reduce(function(sum, item) {
    if(typeof item == 'number') {
      return sum;
    } else {
      return sum + balance(item);
    }
  },0);
}

console.log(balance([1,2,[3,4],5]));

一个简单的递归函数:

function balance(arr, total) {
  total = total || 0;
  if (arr.length === 0) return total;
  var head = arr[0];
  if (typeof head === 'number') {
    return balance(arr.slice(1), total += head);
  } else {
    return balance(head, total);
  }
}

balance([1, [2, 1, 3, [43, 2]]])); // 52

一个简单的递归函数:

function balance(arr, total) {
  total = total || 0;
  if (arr.length === 0) return total;
  var head = arr[0];
  if (typeof head === 'number') {
    return balance(arr.slice(1), total += head);
  } else {
    return balance(head, total);
  }
}

balance([1, [2, 1, 3, [43, 2]]])); // 52

为了证明递归是必需的,这里有一个使用顺序算法的版本。递归是简洁的,通常更容易阅读,但是如果速度很重要,它可能会很慢。然而,根据来自的结果,脚本引擎在优化递归代码方面似乎比过去要好得多,至少对于像这样的简单程序来说是这样

为了进行比较,我包括了使用普通循环的递归版本,测试还包括使用reduce的固定递归版本。我怀疑Any的回答将是最慢的,因为它在每个循环中调用slice和自身,但我没有时间修复它

所以我想递归在这里很好,因为它快速而简洁

/*对嵌套数组的值求和。仅检查值是否为数组, **否则,假设它们是数字 ** **@param{Array}arr-要处理的数字数组,可能有 **嵌套的数字数组 **@返回{number}-值之和或NaN(如果arr不是数组) */ 功能平衡{ //仅进程阵列 var isArray=Array.isArray; 如果!isArrayarr返回NaN; //设置 变量数组=[],索引=[]; var currentArray=arr; 无功电流值; var总和=0; 变量i=0,iLen=arr.length;
//使用只是为了证明需要递归的说法是错误的,这里有一个使用顺序算法的版本。递归很简洁,通常更容易阅读,但是如果速度很重要,它可能会很慢。但是,根据脚本引擎的结果,它似乎比以前更擅长优化递归代码,至少至少对于这样的简单程序

作为比较,我已经包括了一个使用普通循环的递归版本,测试还包括一个使用reduce的固定递归版本。我怀疑Any的答案将是最慢的,因为它在每个循环上调用slice和它自己,但我没有时间修复它

所以我想递归在这里很好,因为它快速而简洁

/*对嵌套数组的值求和。仅检查值是否为数组, **否则,假设它们是数字 ** **@param{Array}arr-要处理的数字数组,可能有 **嵌套的数字数组 **@返回{number}-值之和或NaN(如果arr不是数组) */ 功能平衡{ //仅进程阵列 var isArray=Array.isArray; 如果!isArrayarr返回NaN; //设置 变量数组=[],索引=[]; var currentArray=arr; 无功电流值; var总和=0; 变量i=0,iLen=arr.length;
//使用我可能会使用递归reduce以以下方式解决此问题:

function balance(arr) {
  return arr.reduce(function(sum,item) { 
    return sum + (item instanceof Array ? balance(item) : item);
  }, 0); 
};

balance([1,[2,1,[1,2,-1],[1]],1,[2,1]]); // 11
如果您不介意开销,您当然可以这样做:

Number.prototype.balance = function() { return this; };
Array.prototype.balance = function() { return this.reduce(function(a,b) { return a + b.balance(); }, 0); }

[1,[2,1,[1,2,-1],[1]],1,[2,1]].balance(); // 11

我可能会使用递归reduce以以下方式解决此问题:

function balance(arr) {
  return arr.reduce(function(sum,item) { 
    return sum + (item instanceof Array ? balance(item) : item);
  }, 0); 
};

balance([1,[2,1,[1,2,-1],[1]],1,[2,1]]); // 11
如果您不介意开销,您当然可以这样做:

Number.prototype.balance = function() { return this; };
Array.prototype.balance = function() { return this.reduce(function(a,b) { return a + b.balance(); }, 0); }

[1,[2,1,[1,2,-1],[1]],1,[2,1]].balance(); // 11

通过声音显示数组和尝试的代码递归地减少。但是,任何尝试的解决方案都没有结果?减少对模块化代码有帮助,但for循环可能更快,代码也不会太多。如果可以避免递归,它会很慢。@RobG:除非知道嵌套的深度,否则在这里无法避免递归,th是吗?除非知道我们处理的数据量不合理,否则我不会用可读性来换取执行速度。@ArnoldB我想你可能遗漏了一个reduce函数和array数组和你尝试的代码递归地减少了,但是你尝试的任何解决方案都没有结果。reducee可以帮助处理模块化代码,但for循环可能更快,代码也不会太多。如果可以避免递归,它会很慢。@RobG:除非知道嵌套的深度,否则这里就没有办法避免递归,是吗?除非知道我们处理的数据量不合理,否则我不会用可读性换取exe的速度cution.@ArnoldB我想您可能遗漏了一个reduce函数,而arrayth不起作用,您需要在行返回sum;之前加sum+=item。这不起作用,您需要在行返回sum;之前加sum+=item。不适用于像[1,[2],1]这样嵌套的数组,它返回3而不是4。在数组的每个成员上调用自己,而不是在遇到新的数组成员时调用自己,效率也很低。注意:我正要评论你在评论中不必要的好斗,但现在我不必这么做。感谢你发现了错误,并为我指出了正确的方向。递归仍然会导致这给我带来了一些问题,但我最终会实现的。确保书面com是一个挑战
交流保持友好,无需过度使用表情符号或过于谨慎,这本身就可能令人讨厌。请接受善意的评论,而不是争论性的评论-不适用于嵌套为[1、[2]和[1]的数组,它返回3而不是4。与遇到新的数组成员相比,调用数组中的每个成员也是低效的。注意:我正要评论你在评论中不必要的好斗,但现在我不必了。谢谢你发现了这个错误,给我指出了正确的方向。递归仍然会给我带来一些问题,但我最终还是会解决的。要确保书面交流保持友好,而不过度使用表情符号或过于谨慎,这是一个挑战,因为过度谨慎本身可能会让人恼火。请接受善意的评论,而不是争论性的评论-