簡體   English   中英

將 reduce() 與 + 運算符一起使用的最簡潔方法是什么?

[英]What is the most concise way to use reduce() with the + operator?

情況:我想使用二進制加法來調用reduce

理想的情況是簡潔,語法優雅,即,

arr.reduce( +, 0 )

但這實際上並不像書面那樣工作。 我在網上看到的例子往往更像

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

這行得通,但感覺應該有一種更簡單、更“優雅”的方式來做像二進制加法這樣簡單的事情。

問題:有什么方法可以避免定義整個匿名 function 只是告訴reduce我想要二進制加法?

這表明盡管 JavaScript 可以啟用函數式編程風格(在一定程度上),但 JavaScript不是函數式語言。

我認為你所擁有的已經足夠好了。 在這一點上,你能做的最好的事情就是盡可能清楚地表達你的意圖(當然是 YMMV):

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

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

JavaScript 不是函數式語言?!

Well that's just my opinion of course but unlike other languages such as Clojure or Haskell, in JavaScript + isn't a function but an operator meaning that you cannot assign it to a variable or pass it as a parameter.

在 Haskell 中,您可以添加兩個數字,如下所示:

40 + 2

+似乎是一個運算符,但它實際上是一個(中綴)function,您可以將其作為參數傳遞並部分應用:

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

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

在 Clojure 中,您可以添加兩個數字,如下所示

(+ 40 2)
; 42

然而在 Clojure 中+實際上也是一個 function:

(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;
}

然后,當你想使用你的減少 function 添加這個

let i = arr.reduce(add)

簡而言之,不,我不這么認為。

據我所知,運算符(作為表達式的一部分)不能用作 function arguments 因為一旦定義它們就會被評估。

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, 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>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM