Javascript 在循环时,有没有办法避免可读性和性能之间的权衡?

Javascript 在循环时,有没有办法避免可读性和性能之间的权衡?,javascript,functional-programming,Javascript,Functional Programming,因此,这是一种可读的方式(代码不重要,重要的是样式): 和循环被认为是一种更快的方法: for(/* whatever */) { // looping once, and doing all we need in the same loop } 所以我的问题是:有没有一种方法,也许是从函数式编程的角度,将前者的可读性与后者的性能结合起来 另外,有一种趋势是对这些问题投反对票。如果你想,请写下原因。当然有 第1种选择:传感器 const-mapReduce=map=>reduce=>(

因此,这是一种可读的方式(代码不重要,重要的是样式):

和循环被认为是一种更快的方法:

for(/* whatever */) { 
  // looping once, and doing all we need in the same loop
}
所以我的问题是:有没有一种方法,也许是从函数式编程的角度,将前者的可读性与后者的性能结合起来

另外,有一种趋势是对这些问题投反对票。如果你想,请写下原因。

当然有

第1种选择:传感器

const-mapReduce=map=>reduce=>(acc,x)=>
减少(acc,map(x));
常量过滤器减少=过滤器=>减少=>(acc,x)=>
过滤器(x)
? 减少(acc,x)
:acc;
常数转换=(…ts)=>xs=>
x.reduce(ts.reduce(comp,id)(concat),[]);
常数comp=(f,g)=>
x=>f(g(x));
常数id=x=>x;
const concat=(xs,ys)=>
xs.concat(ys);
常数sqr=n=>n*n;
常数isOdd=n=>n&1==1;
const log=console.log;
//上面的代码通常是库代码
//因此,您不必处理它的复杂性,只需处理它的API
常数tx=过滤器减少量(isOdd),
ty=mapReduce(sqr);
常数r=传感器(tx,ty)([1,2,3,4,5]);//在同一迭代中过滤/映射
对数(r)当然有

第1种选择:传感器

const-mapReduce=map=>reduce=>(acc,x)=>
减少(acc,map(x));
常量过滤器减少=过滤器=>减少=>(acc,x)=>
过滤器(x)
? 减少(acc,x)
:acc;
常数转换=(…ts)=>xs=>
x.reduce(ts.reduce(comp,id)(concat),[]);
常数comp=(f,g)=>
x=>f(g(x));
常数id=x=>x;
const concat=(xs,ys)=>
xs.concat(ys);
常数sqr=n=>n*n;
常数isOdd=n=>n&1==1;
const log=console.log;
//上面的代码通常是库代码
//因此,您不必处理它的复杂性,只需处理它的API
常数tx=过滤器减少量(isOdd),
ty=mapReduce(sqr);
常数r=传感器(tx,ty)([1,2,3,4,5]);//在同一迭代中过滤/映射

对数(r)就我个人而言,我不认为在代码中有一些for循环会使代码不可读,但我认为这是基于观点的

有许多方法可以使代码更具可读性。如果你经常使用这个功能,那么你可以创建一个方法来添加到<代码>数组。原型——这样你就可以写一次for循环并在需要时调用它,而不必看到你认为丑陋的代码。以下是一个例子:

//此方法现在可用于所有阵列实例:
Array.prototype.prettyLoop=函数(){
log('我所做的就是执行一个基本for循环');
for(设i=0;i[“a”,1,null,“x”,1989,false,{}就我个人而言,我不认为在代码中有一些for循环会使代码不可读,但我认为这是基于观点的

有许多方法可以使代码更具可读性。如果你经常使用这个功能,那么你可以创建一个方法来添加到<代码>数组。原型——这样你就可以写一次for循环并在需要时调用它,而不必看到你认为丑陋的代码。以下是一个例子:

//此方法现在可用于所有阵列实例:
Array.prototype.prettyLoop=函数(){
log('我所做的就是执行一个基本for循环');
for(设i=0;i[“a”,1,null,“x”,1989,false,{}
如果忽略函数调用开销,我不完全相信
filter().map()
(按该顺序)比for循环慢。是的,它循环了两次,但是(…){dotwo thing}
与(…){doone thing}for(…){doone thing}
相同,因为你最终做的事情数量相同。@apokryfos谢谢你的意见!那么你的意思是最终有相同数量的操作?有趣的一点。你是说循环本身在性能方面几乎什么都不是?是吗?在大多数情况下,使用
for
方法造成的性能损失可以忽略不计。尽管这个问题主要倾向于固执己见(可读代码是主观的——我发现for循环很好),但确实有一些方法可以满足您的要求,例如库。我认为这是一个很好的示例。您的基准测试是否表明函数样式与显式循环有明显的不同?如果您使用的是大型数据集,那么使用函数样式和延迟评估实际上可能会获得性能提升(提到的lazy.js是另一个例子。一般来说,性能受大局的影响很大,而受小细节的影响较小。如果忽略函数调用开销,我不完全相信
filter().map()
(按该顺序)比for循环慢。是的,它循环两次,但
for(…){做两件事}
与(…){做一件事}的(…){做另一件事}的
相同
因为你最终做了同样数量的事情。@apokryfos谢谢你的意见!那么你的意思是最终有相同数量的操作?有趣的一点。你的意思是循环本身在性能方面几乎什么都不是?是吗?在大多数情况下,使用方法超过
for
的性能损失可以忽略不计。尽管他的问题主要倾向于固执己见(可读代码是主观的——我发现for循环很好),确实有一些方法可以满足您的要求,例如库。我认为这是一个很好的例子。您的基准测试是否表明函数样式与显式循环有明显的不同?如果您使用的是大型数据集,您可能会使用函数样式和惰性评估获得性能提升(前面提到的lazy.js是另一个例子,一般来说,t对性能影响很大
for(/* whatever */) { 
  // looping once, and doing all we need in the same loop
}