【问题标题】:JavaScript: Calling Array.reduce when outer function is called, and outer function has arguments [duplicate]JavaScript:调用外部函数时调用Array.reduce,并且外部函数有参数[重复]
【发布时间】:2019-03-12 00:56:51
【问题描述】:
var foo = 0;
var bar = 0;
var arr1 = [1, 2, 3, 4, 5];
var arr2 = [6, 7, 8, 9, 10];

function getSum(arr, sum) {
    sum = arr.reduce(function(accum, val) {
      return accum += val;
    }, 0)
}

getSum(arr1, foo); //expect foo to equal 15, but it stays at 0
getSum(arr2, bar); //expect bar to equal 40, but it stays at 0

我想多次使用这个函数,因此需要参数。我知道让sum 参数等于Array.reduce() 不是你应该做的,但我真的不确定语法应该是什么。

基本上,我希望arr1 的值始终与foo 相加,arr2 始终与bar 相加,而不必重复我的代码。

【问题讨论】:

  • 你没有从getSum 返回任何东西,它应该是undefined,而不是0。你的代码中也没有data。将其修复为arr,它按预期工作。
  • 如果你想给reduce提供一个初始参数,把它作为第二个参数传递(而不是使用0)
  • 您不能将变量传递给这样的函数并期望将值分配回该变量。您需要从函数返回值并将返回的变量分配给函数:foo = getSum(arr)
  • sum arg 按值传递,而不是通过引用传递。这是因为sum 是原始类型(Number)。

标签: javascript arrays reduce


【解决方案1】:

如果我理解正确,您只需要这样的求和函数:

var foo = 0;
var bar = 0;
var arr1 = [1, 2, 3, 4, 5];
var arr2 = [6, 7, 8, 9, 10];

const getSum = (arr) => arr.reduce((r,c) => r+c)

foo = getSum(arr1)
bar = getSum(arr2)
 
console.log(foo)
console.log(bar)

【讨论】:

  • 您的答案的第一部分是完美的。第二部分是绝对的废话。 foobar 不会被分配任何东西。他们将始终将0 作为值
  • 是的,那里的测试是错误的。好点子!
  • 还有一点小提示:恕我直言,出于一致性原因,最好使用常规函数而不是箭头函数(OP 可能不熟悉箭头函数语法,因此他可能看不到您的答案对他的代码的改进)。
【解决方案2】:

在 JavaScript 中,原始类型是按值传递的。对象通过引用传递。您可以通过将foo 包装在一个对象中来完成此操作,但您真的不应该以这种方式设计代码。改变函数参数的代码通常很难推理(和调试)。

var foo = { value: 0 };
var bar = { value: 0 };
var arr1 = [1, 2, 3, 4, 5];
var arr2 = [6, 7, 8, 9, 10];
    
function getSum(arr, sum) {
    sum.value = arr.reduce(function(accum, val) {
      return accum += val;
    }, 0)
}
    
getSum(arr1, foo);
getSum(arr2, bar);

console.log(foo.value);
console.log(bar.value);

如果可能,您应该尝试找到一种方法来解决您的问题而不会发生突变。

事实上,许多 linting 工具(如 eslint)在看到函数参数发生变异时会抛出错误。

相反,您应该将sum 函数与结果值的赋值分开:

var arr1 = [1, 2, 3, 4, 5];
var arr2 = [6, 7, 8, 9, 10];
        
function sum(arr) {
    return arr.reduce(function(acc, next) { return acc + next });
}

var foo = sum(arr1);
var bar = sum(arr2);
    
console.log(foo);
console.log(bar);

【讨论】:

  • 第二个 sn-p,返回 arr.reduce 似乎有效。我以为我总是必须为Array.reduce() 分配一个值,但是在我刚刚返回该方法的地方这样做是有效的。谢谢。
  • @00Saad 如果没有向reduce 提供初始值,它将使用数组的第一个值作为初始值。
猜你喜欢
  • 2018-04-22
  • 2013-01-12
  • 2013-01-22
  • 2014-10-01
  • 2014-12-29
  • 1970-01-01
  • 2017-02-01
  • 2015-03-02
  • 2019-12-13
相关资源
最近更新 更多