成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

[翻譯]map和reduce,處理數(shù)據(jù)結(jié)構(gòu)的利器

233jl / 1152人閱讀

摘要:一個簡單的實踐返回數(shù)組或類似結(jié)構(gòu)中滿足條件的第一個元素。這個翻譯項目才開始,以后會翻譯越來越多的作品。

原文地址:https://codeburst.io/writing-javascript-with-map-reduce-980602ff2f2f  
作者:Shivek Khurana
簡介:本文是一份編寫優(yōu)雅、簡潔和函數(shù)式ES6代碼的快捷清單。

現(xiàn)如今JavaScript有許多問題,但是詞法并不是其中之一。不管是三元運算符,還是map/reduce等ES6方法,亦或是擴展運算符(...)都是非常強大的工具。

除了能夠保證可讀性以及準確性,這些方法還有助于實現(xiàn)不可變性,因為這些方法會返回新的數(shù)據(jù),而處理前的原始數(shù)據(jù)并不會被修改。這樣的處理風(fēng)格很適合redux以及Fractal。

話不多說,讓我們開始吧。

一個簡單的reduce實踐

當你想要將多個數(shù)據(jù)放進一個實例中時,你可以使用一個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函數(shù)
  0 // 初始化投票數(shù)為0
);
console.log(totalUpvotes)//輸出投票總數(shù):92

傳給reduce的第一個參數(shù)函數(shù)還可以增加2個參數(shù):

第三個參數(shù):每個元素在原數(shù)據(jù)結(jié)構(gòu)中的位置,比如數(shù)組下標。

第四個參數(shù):調(diào)用reduce方法的數(shù)據(jù)集合,比如例子中的posts。
所以,一個reducer的完全體應(yīng)該是下面這樣的:

collection.reduce(
  (accumulator, currentElement, currentIndex, collectionCopy) => 
    {/*function body*/},
    initialAccumulatorValue
);
一個簡單的map實踐

map方法的作用在于處理流式數(shù)據(jù),比如數(shù)組。我們可以把它想象成所有元素都要經(jīng)過的一個轉(zhuǎn)換器。

const integers = [1, 2, 3, 4, 6, 7];
const twoXIntegers = integers.map(i => i*2);
// twoXIntegers現(xiàn)在是 [2, 4, 6, 8, 12, 14],而integers不發(fā)生變化。
一個簡單的find實踐

find返回數(shù)組或類似結(jié)構(gòu)中滿足條件的第一個元素。

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方法可以篩除數(shù)組和類似結(jié)構(gòu)中不滿足條件的元素,并返回滿足條件的元素組成的數(shù)組。

const integers = [1, 2, 3, 4, 6, 7];
const evenIntegers = integers.filter(i => i%2 === 0);
// evenIntegers的值為[2, 4, 6]
向數(shù)組中新增元素

如果你要創(chuàng)建一個無限滾動的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"]
為一個數(shù)組創(chuàng)建視圖

如果需要實現(xiàn)用戶從購物車中刪除物品,但是又不想破壞原來的購物車列表,可以使用filter方法。

const myId = 6;
const userIds = [1, 5, 7, 3, 6];
const allButMe = userIds.filter(id => id !== myId);
// allButMe is [1, 5, 7, 3]
譯者注:這里我猜測作者是不想修改原來的數(shù)組所以使用的filter,但是不能理解為什么要舉購物車的例子。
向?qū)ο髷?shù)組添加新元素
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}
修改數(shù)組中滿足條件的元素對象
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"}
];
*/
找出數(shù)組中滿足條件的元素
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提供了一個更優(yōu)雅的方法:

const user = {name: "Shivek Khurana", age: 23, password: "SantaCl@use"};
const userWithoutPassword = (({name, age}) => ({name, age}))(user);

他還表示這個方法在對象屬性更少時也能發(fā)揮作用。

將對象轉(zhuǎn)化成請求串

你也許幾乎遇不到這個需求,但是有時候在別的地方會給你一點啟發(fā)。

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"
獲取數(shù)組中某一對象的下標
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);
譯者注:這里我覺得方法很繁瑣??梢允褂胒indIndex方法:const requiredIndex = posts.findIndex(obj=>obj.id===131);,同樣能獲取到下標值2。
作者總結(jié)

有了這些強大的方法,我希望你的代碼會變得越來越穩(wěn)定和一絲不茍。當你的團隊中有一個新的開發(fā)者加入時,可以向他推薦這篇文章,讓他了解以前不知道的秘密。

這個翻譯項目才開始,以后會翻譯越來越多的作品。我會努力堅持的。  
項目地址:https://github.com/WhiteYin/translation

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/107196.html

相關(guān)文章

  • JavaScript中函數(shù)式編程二(翻譯)

    摘要:原文鏈接原文作者函數(shù)式編程這篇文章是介紹函數(shù)式編程的四篇文章中的第二篇。這些部分被使用的越來越頻繁,人們把他們放到一個函數(shù)式編程的庫里面,有一些流行的庫包括未亡待續(xù)閱讀下一節(jié)原文地址歡迎關(guān)注 showImg(https://segmentfault.com/img/bVtSez); tips 原文鏈接: http://jrsinclair.com/articles/2016/gentl...

    smartlion 評論0 收藏0
  • 翻譯連載 | JavaScript輕量級函數(shù)式編程-第 8 章:列表操作 |《你不知道JS》姊妹篇

    摘要:通過對一系列任務(wù)建模來理解一些非常重要的函數(shù)式編程在列表操作中的價值一些些看起來不像列表的語句作為列表操作,而不是單獨執(zhí)行。映射我們將采用最基礎(chǔ)和最簡單的操作來開啟函數(shù)式編程列表操作的探索。函子是采用運算函數(shù)有效用操作的值。 原文地址:Functional-Light-JS 原文作者:Kyle Simpson-《You-Dont-Know-JS》作者 關(guān)于譯者:這是一個流淌著...

    sPeng 評論0 收藏0
  • [翻譯]你點ES6小技巧,請查收

    摘要:如果你還知道其他一些小技巧,歡迎留言。下面的代碼將統(tǒng)計每一種車的數(shù)目然后把總數(shù)用一個對象表示。由于我們使用的是,函數(shù)把返回值放在一個數(shù)組中。而我們使用數(shù)組解構(gòu)后就可以把返回值直接賦給相應(yīng)的變量。查看更多我翻譯的文章請訪問項目地址專欄 原文地址:https://medium.freecodecamp.org/check-out-these-useful-ecmascript-2015-e...

    MadPecker 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<