![]() |
VOOZH | about |
打個比方,你有一組數據,需要根據拼音首字母字母索引顯示在頁面上,如圖:
這種索引性的展示已經隨處可見。對於我們前端開發來說這種展示最喜歡的數據格式可能是這樣的:
👁 Image 或者這樣:
...👁 Image 分享之前我還是要推薦下我自己的前端學習群:180442230,不管你是小白還是大牛,小編我都挺歡迎,不定期分享乾貨,包括我自己整理的一份2017最新的前端資料和零基礎入門教程,送給大家,歡迎初學和進階中的小夥伴
...
相信對於大多數的前端來說,這樣的數據去格式化模板都是非常受歡迎的。相比之下,對於上面的例子來說,第一種數據格式更加方便前端大多數的模板使用,而第二種方式更加直觀。然而,我們後端的同事吐給我們的很可能是這樣的數據格式:
相信大家都多次遇到過類似的問題,除了轉換數據格式外我找不到一個真正滿意的解決方案。對於前端來說最簡單辦法可能是叫後端轉換成你想要的數據格式。不過這肯定不是這篇文章想要說明的,我們需要自己動手將數據格式轉換成我們想要的。根據上面的例子,做直觀的做法是將數據按首字母分組,可惜的是 Javascript 的 Array 對象中沒有原生的 groupBy 方法,但我們自己添加一個不是太難。
Javascript 提供了許多其他功能強大的方法,比如 map、filter、sort 等等。今天我們用一個 ES5 的方法 reduce。
reduce 方法的工作原理是 將累加器和數組中的每個元素 (從左到右)應用一個函數, 本質上它的目的是將一個數組 「減少」 成一個對象。詳細說明可以查看 MDN 文檔。下面就用 reduce 方法來實現 groupBy :
我們在需要處理的數組上調用 reduce 方法,並傳入兩個參數,第一個是 callback ,我們要在數組中的每個元素上運行的函數,第二個是累加器,本質上說這個參數是用於第一次調用 callback 函數的第一個參數。因為我們需要得到是一個對象,為此,我們使用一個空對象 {} 。
reduce方法將遍歷數組中的每個元素,通過傳入累加器和當前元素調用我們的 callback 函數。該 callback 函數的工作是找出將元素放在累加器中的位置,然後返回更新的累加器,具體實現:
我們希望根據給定屬性的值對所有數組元素進行分組。所以如果該屬性是 initial ,那麼在開始的例子中,起亞和奇瑞應該在一個分組中,因為他們的首字母都是q,
沒幾行代碼,就可以幫我們完整數據格式轉換。
回調最開始的例子,我們來驗證一下我們的 groupBy 方法。
好了,大功告成?或許這不是我們要的最終結果,實際工作中,以下的數據格式可能更加適用於我們前端模板:
實際工作中,掌握一些數據格式裝換的技能非常有用,也非常常見,後端同事對於同一份數據可能只會給你一個接口或一種數據格式。除非你碰到了一個大好人,碰到個較真的會跟你談人生,誰都希望自己代碼的邏輯簡單。當然我這裡只是給了一個最簡單的示例,你可能會碰到數據格式裝換或者數據操作更加複雜的情況。學習 Javascript 基礎和原生對象的方法非常重要。
當然,你也可以使用一些工具類庫來解決問題,比如 Lodash 和 Underscore.js 都包含我們上面說的 groupBy 方法,當然還有很多其他有用的方法。不過對於一些有潔癖的工程師來說,一個簡單的小功能,引入一個類庫,確實有點不值。