foreach跳出本次循環 js判斷空對象的方法
JavaScript是一種發展迅速的語言 。這篇文章 , 我想展示一些有關如何在JavaScript中應用函數式編程的示例 。
JavaScript中的函數式編程即使函數式編程可以極大地改善應用程序的代碼 , 但其原理在開始時可能會有些挑戰 。由于詳細解釋所有這些都將花費大量時間 , 因此我們決定使用兩個實際的代碼示例來介紹這些概念

文章插圖
1.Maybe Monad在第一個示例中 , 我們找到一種避免驗證變量是否為Null的方法 。假設在我們的應用程序中 , 我們可以找到具有以下格式的用戶:
const someUser = { name: 'some_name', email: 'some@email.com', settings: {language: 'sp' }};有一個功能 , 可以以用戶設置的語言返回歡迎消息 。const allGreetings = { 'en': '嗨', 'sp': '你好', 'fr': '歡迎你'};const getGreetingForUser = (user) => { //將要執行}來看一個遵循命令式模型的“ getGreetingForUser”函??數的實現:const getGreetingForUser = (user) => { if (!user) {return allGreetings.en; } if (user.settings && user.settings.language) {if (allGreetings[user.settings.language]) {return allGreetings[user.settings.language]} else {return allGreetings.en;} } else {return allGreetings.en; }};console.log(getGreetingForUser(someUser));如上面所看到的 , 必須檢查用戶是否已經存在 , 是否已設置語言 , 以及是否已準備好歡迎消息 。如果出現問題 , 我們將以默認語言返回一條消息 。現在 , 讓我們看一下相同的函數 , 但是這次我們將在其實現中使用函數式編程:
const getGreetingForUser = (user) => {return RamdaFantasy.Maybe(user).map(Ramda.path(['settings', 'language'])).chain(maybeGreeting);};const maybeGreeting = Ramda.curry((greetingsList, userLanguage) => {return RamdaFantasy.Maybe(greetingsList[userLanguage]);})(allGreetings);console.log(getGreetingForUser(someUser).getOrElse(allGreetings.en));為了處理可能為null或未定義的情況 , 我們將使用Maybe Monad 。這使我們可以在對象周圍創建包裝器 , 并為空對象分配默認行為 。
文章插圖
讓我們比較兩種解決方案:
//代替驗證用戶是否為空if (!user) {return allGreetings.en;}//我們將用:RamdaFantasy.Maybe(user) //我們將用戶添加到包裝器中//代替: if (user.settings && user.settings.language) {if (allGreetings[user.settings.language]) {//我們將用: <userMaybe>.map(Ramda.path(['settings', 'language'])) //如果存在數據 , 映射將會用它//不是在else中返回默認值: return indexURLs['en'];.getOrElse(allGreetings 。EN)// 指定的默認值 。2 Either Monad當我們知道存在空錯誤時的默認行為時 , Maybe Monad非常有用 。但是 , 如果我們有一個引發錯誤的函數 , 或者我們將各種引發錯誤的函數鏈接在一起 , 并且我們想知道哪個發生了故障 , 則可以改用Either Monad 。

文章插圖
現在 , 讓我們假設我們要計算產品的價格 , 同時考慮增值稅和可能的折扣 。我們已經有了以下代碼:
const withTaxes = (tax, price) => {2 if (!_.isNumber(price)) {3 return new Error("Price is not numeric");4 }5 return price + (tax * price);6};7const withDiscount = (dis, price) => { 8if (!_.isNumber(price)) { 9return new Error("Price is not numeric"); 10} 11if (price < 5) 12return new Error("Discounts not available for low-priced items"); 13} 14return price - (price * dis);5}; const isError = (e) => e && e.name === 'Error';const calculatePrice(price, tax, discount) => { //將要執行}讓我們來看一個遵循命令式模型的“ calculatePrice”函數的實現:const calculatePrice = (price, tax, discount) => {const priceWithTaxes = withTaxes(tax, price);if (isError(priceWithTaxes)) {return console.log('Error: ' + priceWithTaxes.message);}const priceWithTaxesAndDiscount = withDiscount(discount, priceWithTaxes);if (isError(priceWithTaxesAndDiscount)) {return console.log('Error: ' + priceWithTaxesAndDiscount.message);}console.log('Total Price: ' + priceWithTaxesAndDiscount);}//我們計算出價值25的產品(含21%的增值稅和10%的折扣)的最終價格 。calculatePrice(25, 0.21, 0.10)現在 , 讓我們了解如何使用Either Monad重寫此函數 。都有兩個構造函數 , Left和Right 。我們要實現的是將異常存儲到Left構造函數 , 并將正常結果(快樂路徑)存儲到Right構造函數 。
首先 , 將更改已經存在的withTaxes和withDiscount函數 , 以便在出現錯誤時它們返回Left , 在一切正常的情況下返回Right:
const withTaxes = Ramda.curry((tax, price) => {if (!_.isNumber(price)) {return RamdaFantasy.Either.Left(new Error("Price is not numeric"));}return RamdaFantasy.Either.Right(price + (tax * price)); });const withDiscount = Ramda.curry((dis, price) => {if (!_.isNumber(price)) {return RamdaFantasy.Either.Left(new Error("Price is not numeric"));}if (price < 5) {return RamdaFantasy.Either.Left(new Error("Discounts not available for low-priced items"));}return RamdaFantasy.Either.Right(price - (price * dis)); });然后 , 我們為Right案例創建一個函數(顯示價格) , 為Left案例創建另一個函數(顯示錯誤) , 然后使用它們創建Either Monad:const showPrice = (total) => { console.log('Price: ' + total) }; const showError = (error) => { console.log('Error: ' + error.message); }; const eitherErrorOrPrice = RamdaFantasy.Either.either(showError, showPrice);最后 , 只需要執行Monad來計算最終價格://計算出價值25的產品(含21%的增值稅和10%的折扣)的最終價格 。eitherErrorOrPrice(RamdaFantasy.Either.Right(25).chain(withTaxes(0.21)).chain(withDiscount(0.1)))結論:JavaScript中的函數式編程正如我們所看到的 , 一旦用Maybe和Either單子分解了代碼 , 就沒有那么復雜了 。如果使用得當 , 它們可以使我們的代碼更易于閱讀和維護 。【foreach跳出本次循環 js判斷空對象的方法】唯一的不便是我們需要克服的初始障礙 , 但這可以通過在網上一些示例并進行一些測試來完成 。
推薦閱讀
- 民間童話故事之跳出井底的蛙
- 跳出農村到大城市工作的姑娘還要不要嫁回老家農村?
- 鯉魚為什么會從水里跳出水面
- 本次訪問未經授權是什么意思
- 為什么魚跳出水面的時候,魚口不好?
- 哪種關于甜品的書好
- 為什么超市里的牛蛙不會跳出來
- 你們認為本次疫情會怎么結束?
- 本次疫情已經涉及10個省區市,你支持禁止跨省旅游嘛?
- 海豚為什么要跳出海面
