摘要:一個簡單的實踐返回數組或類似結構中滿足條件的第一個元素。這個翻譯項目才開始,以后會翻譯越來越多的作品。
原文地址:https://codeburst.io/writing-javascript-with-map-reduce-980602ff2f2f
作者:Shivek Khurana
簡介:本文是一份編寫優雅、簡潔和函數式ES6代碼的快捷清單。
現如今JavaScript有許多問題,但是詞法并不是其中之一。不管是三元運算符,還是map/reduce等ES6方法,亦或是擴展運算符(...)都是非常強大的工具。
除了能夠保證可讀性以及準確性,這些方法還有助于實現不可變性,因為這些方法會返回新的數據,而處理前的原始數據并不會被修改。這樣的處理風格很適合redux以及Fractal。
話不多說,讓我們開始吧。
一個簡單的reduce實踐當你想要將多個數據放進一個實例中時,你可以使用一個reducer。
const posts = [ {id: 1, upVotes: 2}, {id: 2, upVotes: 89}, {id: 3, upVotes: 1} ]; const totalUpvotes = posts.reduce((totalUpvotes, currentPost) => totalUpvotes + currentPost.upVotes, //reducer函數 0 // 初始化投票數為0 ); console.log(totalUpvotes)//輸出投票總數:92
傳給reduce的第一個參數函數還可以增加2個參數:
第三個參數:每個元素在原數據結構中的位置,比如數組下標。
第四個參數:調用reduce方法的數據集合,比如例子中的posts。
所以,一個reducer的完全體應該是下面這樣的:
collection.reduce( (accumulator, currentElement, currentIndex, collectionCopy) => {/*function body*/}, initialAccumulatorValue );一個簡單的map實踐
map方法的作用在于處理流式數據,比如數組。我們可以把它想象成所有元素都要經過的一個轉換器。
const integers = [1, 2, 3, 4, 6, 7]; const twoXIntegers = integers.map(i => i*2); // twoXIntegers現在是 [2, 4, 6, 8, 12, 14],而integers不發生變化。一個簡單的find實踐
find返回數組或類似結構中滿足條件的第一個元素。
const posts = [ {id: 1, title: "Title 1"}, {id: 2, title: "Title 2"} ]; // 找出id為1的posts const title = posts.find(p => p.id === 1).title;一個簡單的filter實踐
filter方法可以篩除數組和類似結構中不滿足條件的元素,并返回滿足條件的元素組成的數組。
const integers = [1, 2, 3, 4, 6, 7]; const evenIntegers = integers.filter(i => i%2 === 0); // evenIntegers的值為[2, 4, 6]向數組中新增元素
如果你要創建一個無限滾動的ui組件(比如本文后面提到的例子),可以使用擴展運算符這個非常有用的詞法。
const books = ["Positioning by Trout", "War by Green"]; const newBooks = [...books, "HWFIF by Carnegie"]; // newBooks are now ["Positioning by Trout", "War by Green", "HWFIF // by Carnegie"]為一個數組創建視圖
如果需要實現用戶從購物車中刪除物品,但是又不想破壞原來的購物車列表,可以使用filter方法。
const myId = 6; const userIds = [1, 5, 7, 3, 6]; const allButMe = userIds.filter(id => id !== myId); // allButMe is [1, 5, 7, 3]
譯者注:這里我猜測作者是不想修改原來的數組所以使用的filter,但是不能理解為什么要舉購物車的例子。向對象數組添加新元素
const books = []; const newBook = {title: "Alice in wonderland", id: 1}; const updatedBooks = [...books, newBook]; //updatedBooks的值為[{title: "Alice in wonderland", id: 1}]
books這個變量我們沒有給出定義,但是不要緊,我們使用了擴展運算符,它并不會因此失效。
為對象新增一組鍵值對const user = {name: "Shivek Khurana"}; const updatedUser = {...user, age: 23}; //updatedUser的值為:{name: "Shivek Khurana", age: 23}使用變量作為鍵名為對象添加鍵值對
const dynamicKey = "wearsSpectacles"; const user = {name: "Shivek Khurana"}; const updatedUser = {...user, [dynamicKey]: true}; // updatedUser is {name: "Shivek Khurana", wearsSpectacles: true}修改數組中滿足條件的元素對象
const posts = [ {id: 1, title: "Title 1"}, {id: 2, title: "Title 2"} ]; const updatedPosts = posts.map(p => p.id !== 1 ? p : {...p, title: "Updated Title 1"} ); /* updatedPosts is now [ {id: 1, title: "Updated Title 1"}, {id: 2, title: "Title 2"} ]; */找出數組中滿足條件的元素
const posts = [ {id: 1, title: "Title 1"}, {id: 2, title: "Title 2"} ]; const postInQuestion = posts.find(p => p.id === 2); // postInQuestion now holds {id: 2, title: "Title 2"}
譯者注:奇怪啊,這不就是之前find的簡單實踐嗎?刪除目標對象的一組屬性
const user = {name: "Shivek Khurana", age: 23, password: "SantaCl@use"}; const userWithoutPassword = Object.keys(user) .filter(key => key !== "password") .map(key => {[key]: user[key]}) .reduce((accumulator, current) => ({...accumulator, ...current}), {} ) ; // userWithoutPassword becomes {name: "Shivek Khurana", age: 23}
感謝Kevin Bradley提供了一個更優雅的方法:
const user = {name: "Shivek Khurana", age: 23, password: "SantaCl@use"}; const userWithoutPassword = (({name, age}) => ({name, age}))(user);
他還表示這個方法在對象屬性更少時也能發揮作用。
將對象轉化成請求串你也許幾乎遇不到這個需求,但是有時候在別的地方會給你一點啟發。
const params = {color: "red", minPrice: 8000, maxPrice: 10000}; const query = "?" + Object.keys(params) .map(k => encodeURIComponent(k) + "=" + encodeURIComponent(params[k]) ) .join("&") ; // encodeURIComponent將對特殊字符進行編碼。 // query is now "color=red&minPrice=8000&maxPrice=10000"獲取數組中某一對象的下標
const posts = [ {id: 13, title: "Title 221"}, {id: 5, title: "Title 102"}, {id: 131, title: "Title 18"}, {id: 55, title: "Title 234"} ]; // 找到id為131的元素 const requiredIndex = posts.map(p => p.id).indexOf(131);
譯者注:這里我覺得方法很繁瑣。可以使用findIndex方法:const requiredIndex = posts.findIndex(obj=>obj.id===131);,同樣能獲取到下標值2。作者總結
有了這些強大的方法,我希望你的代碼會變得越來越穩定和一絲不茍。當你的團隊中有一個新的開發者加入時,可以向他推薦這篇文章,讓他了解以前不知道的秘密。
這個翻譯項目才開始,以后會翻譯越來越多的作品。我會努力堅持的。
項目地址:https://github.com/WhiteYin/translation
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/107196.html
摘要:原文鏈接原文作者函數式編程這篇文章是介紹函數式編程的四篇文章中的第二篇。這些部分被使用的越來越頻繁,人們把他們放到一個函數式編程的庫里面,有一些流行的庫包括未亡待續閱讀下一節原文地址歡迎關注 showImg(https://segmentfault.com/img/bVtSez); tips 原文鏈接: http://jrsinclair.com/articles/2016/gentl...
摘要:通過對一系列任務建模來理解一些非常重要的函數式編程在列表操作中的價值一些些看起來不像列表的語句作為列表操作,而不是單獨執行。映射我們將采用最基礎和最簡單的操作來開啟函數式編程列表操作的探索。函子是采用運算函數有效用操作的值。 原文地址:Functional-Light-JS 原文作者:Kyle Simpson-《You-Dont-Know-JS》作者 關于譯者:這是一個流淌著...
摘要:如果你還知道其他一些小技巧,歡迎留言。下面的代碼將統計每一種車的數目然后把總數用一個對象表示。由于我們使用的是,函數把返回值放在一個數組中。而我們使用數組解構后就可以把返回值直接賦給相應的變量。查看更多我翻譯的文章請訪問項目地址專欄 原文地址:https://medium.freecodecamp.org/check-out-these-useful-ecmascript-2015-e...
閱讀 1322·2021-11-24 09:38
閱讀 3261·2021-11-22 12:03
閱讀 4184·2021-11-11 10:59
閱讀 2324·2021-09-28 09:36
閱讀 1037·2021-09-09 09:32
閱讀 3424·2021-08-05 10:00
閱讀 2535·2021-07-23 15:30
閱讀 2979·2019-08-30 13:12