微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将 reduce() 与 + 运算符一起使用的最简洁方法是什么?

如何解决将 reduce() 与 + 运算符一起使用的最简洁方法是什么?

情况:我想使用二进制加法调用 reduce

理想的是简洁的,具有优雅的语法,即

arr.reduce( +,0 )

但这实际上并不像写的那样工作。我在网上看到的例子往往更像

arr.reduce( (a,b) => a+b,0 )

这行得通,但感觉应该有一种更简单、更“优雅”的方式来做一些像二进制加法这样简单的事情。

问题:有什么方法可以避免定义一个完整的匿名函数只是为了告诉reduce我想要二进制加法?

解决方法

这表明,尽管 JavaScript 可以启用函数式编程风格(在一定程度上),但 JavaScript 不是函数式语言。

我认为你所拥有的已经足够好了。在这一点上,你能做的最好的事情就是尽可能清楚地表达你的意图(当然是YMMV):

const add = (a,b) => a + b;
const sum = (...xs) => xs.reduce(add,0);

sum(40,1,1);
// 42

JavaScript 不是函数式语言?!

当然,这只是我的看法,但与 Clojure 或 Haskell 等其他语言不同,在 JavaScript 中 + 不是函数而是运算符,这意味着您不能将其分配给变量或将其作为参数传递.

在 Haskell 中,您可以添加两个数字,如下所示:

40 + 2

看起来 + 是一个运算符,但它实际上是一个(中缀)函数,您可以将其作为参数传递并部分应用:

foldl (+) 0 [40,1]
-- 42

map (+ 10) [40,1]
-- [50,11,11]

在 Clojure 中,您可以添加两个数字,如下所示

(+ 40 2)
; 42

但是在 Clojure 中 + 实际上也是一个函数:

(reduce + 0 '(40 1 1))
; 42

然而,这不是必需的,因为 + 无论如何都可以处理数字列表:

(+ 40 1 1)
; 42
(+ 39 1 1 1)
; 42
(+ 38 1 1 1 1)
; 42
,

如果您要多次使用 reduce,则有一种更优雅的使用方式,尽管没有内置方式。 将此添加到代码的底部

function add(a,b){
  return total + num;
}

然后,当你想使用你的reduce函数时添加这个

let i = arr.reduce(add)
,

总之不,我不这么认为。

据我所知,运算符(作为表达式的一部分)不能用作函数参数,因为一旦定义它们就会被求值。

arr.reduce(+,0) 的情况下,运行时会尝试评估 + 而不是将其传递给 reduce。

相反,您想要一种将定义调用区分开来的方法,这正是您通过函数获得的语义。

,

正如@superJumbo 所说,操作符不是 JavaScript 中的函数。这很不幸,因为您无法真正受益于 Haskell 等语言的表达能力。

然而,javascript 开发人员提出了旨在带来这种表现力的库! RamdaSanctuary 是绝妙的例子...

const sum = R.reduce(R.add,0);

console.log(
  sum([1,2,3,4,5,6,7]),);
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.27.1/ramda.min.js" integrity="sha512-rZHvUXcc1zWKsxm7rJ8lVQuIr1oOmm7cShlvpV0gWf0RvbcJN6x96al/Rp2L2BI4a4ZkT2/YfVe/8YvB2UHzQw==" crossorigin="anonymous"></script>

或者,更简洁:

console.log(
  R.sum([1,);
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.27.1/ramda.min.js" integrity="sha512-rZHvUXcc1zWKsxm7rJ8lVQuIr1oOmm7cShlvpV0gWf0RvbcJN6x96al/Rp2L2BI4a4ZkT2/YfVe/8YvB2UHzQw==" crossorigin="anonymous"></script>

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。