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)
【讨论】:
您的答案的第一部分是完美的。第二部分是绝对的废话。foo
和 bar
不会被分配任何东西。他们将始终将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的window.onebeforeunload时调用ActionScript函数
HTML中的javascript具体是啥时候调用? 是等整个页面内容都加载完毕时调用吗
在使用带有 sveltekit 的 svelte-forms 时调用外部组件初始化的函数