JavaScript:调用外部函数时调用Array.reduce,并且外部函数有参数[重复]

Posted

技术标签:

【中文标题】JavaScript:调用外部函数时调用Array.reduce,并且外部函数有参数[重复]【英文标题】:JavaScript: Calling Array.reduce when outer function is called, and outer function has arguments [duplicate] 【发布时间】: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)。 【参考方案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 提供初始值,它将使用数组的第一个值作为初始值。

以上是关于JavaScript:调用外部函数时调用Array.reduce,并且外部函数有参数[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何在页面加载时调用 JavaScript 函数?

[当调用Javascript的window.onebeforeunload时调用ActionScript函数

HTML中的javascript具体是啥时候调用? 是等整个页面内容都加载完毕时调用吗

在使用带有 sveltekit 的 svelte-forms 时调用外部组件初始化的函数

如何在 AMX 页面加载时调用 Javascript 函数?

当 Dojo 自动完成器的值改变时调用 java-script 函数