我正在尝试决定是否在Javascript中使用reduce()方法来处理我需要编写的函数,这是这样的
var x = [some array], y = {};
for (...) {
someOperation(x[i]);
y[x[i]] = "some other value";
}
现在显然可以通过以下方式将其写为reduce()函数:
x.reduce(function(prev, current, index, arr) {
someOperation(current);
prev[current] = "some other value";
return prev;
}, {})
或类似的东西。这两者之间有任何表现或其他差异吗?或者其他一些原因(例如浏览器支持),因为在Web编程环境中哪一个应该优先于另一个?感谢。
答案 0 :(得分:4)
即使我更喜欢这些操作(缩小,映射,过滤等),但由于某些浏览器在其实现中不支持它们,因此使用它们仍然不可行。当然,您可以通过扩展Array
原型来“修补”它,但这也会打开一堆蠕虫。
我认为这些功能本身没有任何错误,我认为它们可以提供更好的代码,但是现在最好不要使用它们。一旦更高百分比的人口使用支持这些功能的浏览器,我认为他们将是公平的游戏。
就性能而言,由于函数调用的开销,这些可能比为循环手写的速度慢。
答案 1 :(得分:4)
map
和filter
以及reduce
和forEach
以及...(更多信息:https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array#Iteration_methods)远远优于普通循环,因为:
map
和reduce
等函数可以让您的工作变得更加轻松,因为它们会自动设置您的迭代变量并将其传递给您的函数。 IE9声称支持这些。他们是官方的javascript / ecmascript规范。如果你关心使用IE8的人,这是你的特权。如果你真的在乎,你可以通过覆盖Array.prototype
仅适用于IE8及更早版本来修复IE8及更早版本。
答案 2 :(得分:2)
reduce用于从数组返回一个值,作为顺序处理前一个元素的结果的结果。
reduceRight会做同样的事情,但会从最后开始并向后工作。
map用于返回一个数组,其成员都已通过函数传递。
这两种方法都不会影响数组本身。
var A1 = ['1','2','3','4','5','6','7','8'];
//这种map的使用返回原始元素的新数组,转换为数字 -
A1 = A1.map(数字); //>>每个A1的元素都转换为数字
//此减少总计数组元素 -
var A1sum = A1.reduce(function(a,b){return a + b;});
// A1sum>>返回值:(编号)36
旧版浏览器不支持它们,因此您需要提供替代它们。如果您所做的一切都可以在一个简单的循环中复制,那就不值得了。
确定总体的标准差是一个可以有效使用map和reduce的例子 -
Math.mean= function(array){
return array.reduce(function(a, b){ return a+b; })/array.length;
}
Math.stDeviation=function(array){
var mean= Math.mean(array);
dev= array.map(function(itm){return (itm-mean)*(itm-mean); });
return Math.sqrt(dev.reduce(function(a, b){ return a+b; })/array.length);
}
var A2= [6.2, 5, 4.5, 6, 6, 6.9, 6.4, 7.5];
alert ('mean: '+Math.mean(A2)+'; deviation: '+Math.stDeviation(A2))
答案 3 :(得分:0)
kennebec - 很好,但你的 stDeviation 函数调用 reduce 两次并映射一次只需要一次调用减少(这使得它更快):
Math.stDev = function (a) {
var n = a.length;
var v = a.reduce(function (v, x) {
v[0] += x * x;
v[1] += x;
return v;
}, [0,0]);
return Math.sqrt( (v[0] - v[1]*v[1] / n) / n );
}
在分配给 v [1] 时应该转换为数字,以确保字符串数字不会与结果混淆,并且最后一行中的除数可能是(n - 1)在大多数情况下,但这取决于OP。 : - )