问题描述
我想在Javascript中编写一个函数,允许我传入一个数学运算符和一个int列表,并为该列表中的每个项目应用运算符。
I'd like to write a function in Javascript that allows me to pass in a mathematical operator and a list of ints and for each item in that list, apply the operator to it.
从总和来看,这是我想出来的:
Thinking of it in terms of a sum, this is what I've come up with:
function accumulate(list, operator){
var sum = 0;
for each(var item in list){
sum = accumulator(sum, item);
}
print(sum);
}
测试此代码会产生以下错误:
Testing this code produces the following error:
var list = new Array();
list[0] = 1;
list[1] = 2;
list[2] = 3;
js> accumulate(list, +);
js: "<stdin>", line 9: syntax error
js: accumulate(list, +);
js: ..................^
js: "<stdin>", line 9: Compilation produced 1 syntax errors.
推荐答案
您不能将运算符作为参数传递,但你可以传递一个函数:
You can't pass an operator as a parameter, but you can pass a function:
function accumulate(list, accumulator){ // renamed parameter
var sum = 0;
for(var i = 0; i < list.length; i++){ // removed deprecated for…each loop
sum = accumulator(sum, list[i]);
}
print(sum);
}
accumulate(list, function(a, b) { return a + b; });
这非常接近功能确实,虽然不完全是。要模仿 reduce
的行为,你必须从 list
中获取第一个元素并将其用作种子对于你的累加器,而不是总是使用0:
This is pretty close to what the Array.prototype.reduce
function does, though not exactly. To mimic the behavior of reduce
, you'd have to get the first element from list
and use that as the seed for your accumulator, rather than always using 0:
function accumulate(list, accumulator, seed){
var i = 0, len = list.length;
var acc = arguments.length > 2 ? seed : list[i++];
for(; i < len; i++){
acc = accumulator(acc, list[i]);
}
print(acc);
}
这样,您可以计算列表的乘积
(你的方法总是返回0):
This way, you could compute the product of list
(your method would always return 0):
accumulate(list, function(a, b) { return a * b; });
更新:如果您正在开发支持ECMAScript 2015的新浏览器/ ES6(或使用像Babel这样的转换器),你也可以使用语法使您的代码更紧凑:
Update: If you're developing for newer browsers that support ECMAScript 2015 / ES6 (or using a transpiler like Babel), you can also use 'arrow function' syntax to make your code a bit more compact:
accumulate(list, (a, b) => a * b);
这篇关于传递数学运算符作为参数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!