摘要:指南一作者簡(jiǎn)介是推出的一個(gè)天挑戰(zhàn)。目的是幫助人們用純來(lái)寫(xiě)東西,不借助框架和庫(kù),也不使用編譯器和引用。現(xiàn)在你看到的是這系列指南的第篇。完整指南在從零到壹全棧部落。篩出運(yùn)行結(jié)果是的組成數(shù)組返回。
Day04 - Array Cardio 指南一
實(shí)現(xiàn)效果作者:?liyuechun
簡(jiǎn)介:JavaScript30 是 Wes Bos 推出的一個(gè) 30 天挑戰(zhàn)。項(xiàng)目免費(fèi)提供了 30 個(gè)視頻教程、30 個(gè)挑戰(zhàn)的起始文檔和 30 個(gè)挑戰(zhàn)解決方案源代碼。目的是幫助人們用純 JavaScript 來(lái)寫(xiě)東西,不借助框架和庫(kù),也不使用編譯器和引用。現(xiàn)在你看到的是這系列指南的第 3 篇。完整指南在 從零到壹全棧部落。
這一部分主要是熟悉 Array 的幾個(gè)基本方法,其中有兩個(gè)(filter、map)是 ES6 定義的迭代方法,這些迭代方法都有一個(gè)特點(diǎn),就是對(duì)數(shù)組的每一項(xiàng)都運(yùn)行給定函數(shù),根據(jù)使用的迭代方法的不同,有不同的返回結(jié)果。
文檔給出了一個(gè)初始操作的 inventor 數(shù)組,基于這個(gè)數(shù)組可以練習(xí)一下Array的各個(gè)方法,請(qǐng)用Google Chrome瀏覽器打開(kāi) HTML 后在Console面板中查看輸出結(jié)果。
炫酷的調(diào)試技巧在 Console 中我們常用到的可能是 console.log() ,但它還有一個(gè)很炫的輸出,按照表格來(lái)輸出,效果如下:
console.table(thing)原始數(shù)據(jù)
本節(jié)中我們將圍繞如下數(shù)據(jù)進(jìn)行相關(guān)操作以便快速掌握數(shù)組的相關(guān)方法的使用。
const inventors = [{ first: "Albert", last: "Einstein", year: 1879, passed: 1955 }, { first: "Isaac", last: "Newton", year: 1643, passed: 1727 }, { first: "Galileo", last: "Galilei", year: 1564, passed: 1642 }, { first: "Marie", last: "Curie", year: 1867, passed: 1934 }, { first: "Johannes", last: "Kepler", year: 1571, passed: 1630 }, { first: "Nicolaus", last: "Copernicus", year: 1473, passed: 1543 }, { first: "Max", last: "Planck", year: 1858, passed: 1947 }, { first: "Katherine", last: "Blodgett", year: 1898, passed: 1979 }, { first: "Ada", last: "Lovelace", year: 1815, passed: 1852 }, { first: "Sarah E.", last: "Goode", year: 1855, passed: 1905 }, { first: "Lise", last: "Meitner", year: 1878, passed: 1968 }, { first: "Hanna", last: "Hammarstr?m", year: 1829, passed: 1909 } ]; const people = ["Beck, Glenn", "Becker, Carl", "Beckett, Samuel", "Beddoes, Mick", "Beecher, Henry", "Beethoven, Ludwig", "Begin, Menachem", "Belloc, Hilaire", "Bellow, Saul", "Benchley, Robert", "Benenson, Peter", "Ben-Gurion, David", "Benjamin, Walter", "Benn, Tony", "Bennington, Chester", "Benson, Leana", "Bent, Silas", "Bentsen, Lloyd", "Berger, Ric", "Bergman, Ingmar", "Berio, Luciano", "Berle, Milton", "Berlin, Irving", "Berne, Eric", "Bernhard, Sandra", "Berra, Yogi", "Berry, Halle", "Berry, Wendell", "Bethea, Erin", "Bevan, Aneurin", "Bevel, Ken", "Biden, Joseph", "Bierce, Ambrose", "Biko, Steve", "Billings, Josh", "Biondo, Frank", "Birrell, Augustine", "Black Elk", "Blair, Robert", "Blair, Tony", "Blake, William" ]; const data = ["car", "car", "truck", "truck", "bike", "walk", "car", "van", "bike", "walk", "car", "van", "car", "truck", "pogostick" ];篩選 16 世紀(jì)出生的發(fā)明家
filter
過(guò)濾操作,有點(diǎn)像 SQL 里面的 select 語(yǔ)句。篩出運(yùn)行結(jié)果是 true 的組成數(shù)組返回。
const __fifteen = inventors.filter(function(inventor) { if (inventor.year >= 1500 && inventor.year < 1600 ) { return true; } else { return false; } }); console.table(__fifteen);
前面幾篇已經(jīng)提到過(guò)箭頭函數(shù),這里可以簡(jiǎn)化一下,用箭頭函數(shù)來(lái)寫(xiě),而且由于 if 語(yǔ)句的存在并不是必要的,可以寫(xiě)成下面這樣:
const fifteen = inventors.filter(inventor =>(inventor.year >= 1500 && inventor.year < 1600)); console.table(fifteen);
控制臺(tái)效果圖:
展示他們的姓和名map
map 形象的理解就是,把數(shù)組中的每個(gè)元素進(jìn)行處理后,返回一個(gè)新的數(shù)組。
例子如下:
// Array.prototype.map() // 2. 展示他們的姓和名 const fullNames = inventors.map(inventor => `${inventor.first} ${inventor.last}`); console.log(fullNames);
控制臺(tái)效果圖:
把他們按照年齡從大到小進(jìn)行排序sort
默認(rèn)情況下,Array.prototype.sort() 會(huì)將數(shù)組以字符串的形式進(jìn)行升序排列(10 會(huì)排在 2 之前),但 sort 也可以接受一個(gè)函數(shù)作為參數(shù)。所以需要對(duì)數(shù)字大小排序時(shí)需要自己設(shè)定一個(gè)比較函數(shù),例子如下:
// Array.prototype.sort() // 3. 把他們按照年齡從大到小進(jìn)行排序 const ordered = inventors.sort((a, b) => { if(a.year > b.year) { return 1; } else { return -1; } }); console.table(ordered);
上面的代碼可以簡(jiǎn)寫(xiě)成:
const ordered = inventors.sort((a, b) => a.year > b.year ? 1 : -1); console.table(ordered);
控制臺(tái)效果圖:
計(jì)算所有的發(fā)明家加起來(lái)一共活了多少歲reduce
// Array.prototype.reduce() // 4. 計(jì)算所有的發(fā)明家加起來(lái)一共活了多少歲 const totalYears = inventors.reduce((total, inventor) => { return total + (inventor.passed - inventor.year); }, 0); console.log(totalYears);
控制臺(tái)效果圖:
// 5. 按照他們活了多久來(lái)進(jìn)行排序 const oldest = inventors.sort((a, b) => { const lastInventor = a.passed - a.year; const nextInventor = b.passed - b.year; return lastInventor > nextInventor ? -1 : 1; }); console.table(oldest);
控制臺(tái)效果圖:
map、filter結(jié)合使用篩選出網(wǎng)頁(yè)中含有CSS標(biāo)題的數(shù)據(jù)名稱(chēng)const category = document.querySelectorAll(".subject-list h2 a"); const links = Array.from(category); const CSS_BOOK = links .map(link => link.textContent) .filter(streetName => streetName.includes("CSS"));
由 querySelectorAll() 獲取到的是一個(gè) NodeList ,它并非是 Array 類(lèi)型的數(shù)據(jù),所以并不具有 map 和 filter 這樣的方法,所以如果要進(jìn)行篩選操作則需要把它轉(zhuǎn)化成 Array 類(lèi)型,使用下面示例之中的 Array.from() 來(lái)轉(zhuǎn)化。
Google Chrome瀏覽球操作如下:
打開(kāi)https://book.douban.com/tag/web網(wǎng)頁(yè)。
在控制臺(tái)按如下圖操作即可
按照姓氏來(lái)對(duì)發(fā)明家進(jìn)行排序const alpha = people.sort((lastOne, nextOne) => { const [aLast, aFirst] = lastOne.split(", "); const [bLast, bFirst] = nextOne.split(", "); return aLast > bLast ? 1 : -1; }); console.log(alpha);
控制臺(tái)效果圖:
統(tǒng)計(jì)給出數(shù)組中各個(gè)物品的數(shù)量reduce
這是一個(gè)歸并數(shù)組的方法,它接受一個(gè)函數(shù)作為參數(shù)(這個(gè)函數(shù)可以理解成累加器),它會(huì)遍歷數(shù)組的所有項(xiàng),然后構(gòu)建一個(gè)最終的返回值,這個(gè)值就是這個(gè)累加器的第一個(gè)參數(shù)。第二個(gè)參數(shù)中的0是previousValue的初始值,例子如下:
[0,1,2,3,4].reduce((previousValue, currentValue, index, array) => { return previousValue + currentValue; },0);
而此處我們需要統(tǒng)計(jì)一個(gè)給定數(shù)組中各個(gè)項(xiàng)的值,恰好可以用到這個(gè)方法,在累加器之中,將統(tǒng)計(jì)信息存入一個(gè)新的對(duì)象,最后返回統(tǒng)計(jì)值。
const data = ["car", "car", "truck", "truck", "bike", "walk", "car", "van", "bike", "walk", "car", "van", "car", "truck", "pogostick" ]; const transportation = data.reduce( (obj, item) => { if (!obj[item]) { obj[item] = 0; } obj[item]++; return obj; }, {}); console.log(transportation);源碼下載
Github Source Code
社群品牌:從零到壹全棧部落
定位:尋找共好,共同學(xué)習(xí),持續(xù)輸出全棧技術(shù)社群
業(yè)界榮譽(yù):IT界的邏輯思維
文化:輸出是最好的學(xué)習(xí)方式
官方公眾號(hào):全棧部落
社群發(fā)起人:春哥(從零到壹創(chuàng)始人,交流微信:liyc1215)
技術(shù)交流社區(qū):全棧部落BBS
全棧部落完整系列教程:全棧部落完整電子書(shū)學(xué)習(xí)筆記
關(guān)注全棧部落官方公眾號(hào),每晚十點(diǎn)接收系列原創(chuàng)技術(shù)推送 |
---|
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/84156.html
摘要:中文指南二作者簡(jiǎn)介是推出的一個(gè)天挑戰(zhàn)。完整中文版指南及視頻教程在從零到壹全棧部落。第七天的練習(xí)是接著之前中文指南一的練習(xí),繼續(xù)熟練數(shù)組的方法,依舊沒(méi)有頁(yè)面顯示效果,所以請(qǐng)打開(kāi)瀏覽器的面板進(jìn)行調(diào)試運(yùn)行。 Day07 - Array Cardio 中文指南二 作者:?liyuechun 簡(jiǎn)介:JavaScript30 是 Wes Bos 推出的一個(gè) 30 天挑戰(zhàn)。項(xiàng)目免費(fèi)提供了 30 個(gè)...
摘要:加入我們,一起挑戰(zhàn)吧掃碼申請(qǐng)加入全棧部落 JavaScript 30 - 一起做一次了不起的挑戰(zhàn) (Node+Vue+微信公眾號(hào)開(kāi)發(fā))企業(yè)級(jí)產(chǎn)品全棧開(kāi)發(fā)速成周末班首期班(10.28號(hào)正式開(kāi)班,歡迎搶座) 在Github上看到了wesbos的一個(gè)Javascript30天挑戰(zhàn)的repo,旨在使用純JS來(lái)進(jìn)行練習(xí),不允許使用任何其他的庫(kù)和框架,該挑戰(zhàn)共30天,我會(huì)在這里復(fù)現(xiàn)這30天遇到的挑...
摘要:上一篇文章指南下一篇文章為在集合上執(zhí)行基本的聚合任務(wù)提供了一些命令。也可以給傳遞一個(gè)查詢(xún)文檔,會(huì)計(jì)算查詢(xún)結(jié)果的數(shù)量對(duì)分頁(yè)顯示來(lái)說(shuō)總數(shù)非常必要共個(gè),目前顯示個(gè)。使用時(shí)必須指定集合和鍵。指定要進(jìn)行分組的集合。 上一篇文章:MongoDB指南---17、MapReduce下一篇文章: MongoDB為在集合上執(zhí)行基本的聚合任務(wù)提供了一些命令。這些命令在聚合框架出現(xiàn)之前就已經(jīng)存在了,現(xiàn)在(大多...
摘要:上一篇文章指南下一篇文章為在集合上執(zhí)行基本的聚合任務(wù)提供了一些命令。也可以給傳遞一個(gè)查詢(xún)文檔,會(huì)計(jì)算查詢(xún)結(jié)果的數(shù)量對(duì)分頁(yè)顯示來(lái)說(shuō)總數(shù)非常必要共個(gè),目前顯示個(gè)。使用時(shí)必須指定集合和鍵。指定要進(jìn)行分組的集合。 上一篇文章:MongoDB指南---17、MapReduce下一篇文章: MongoDB為在集合上執(zhí)行基本的聚合任務(wù)提供了一些命令。這些命令在聚合框架出現(xiàn)之前就已經(jīng)存在了,現(xiàn)在(大多...
閱讀 2185·2021-09-02 15:11
閱讀 1506·2019-08-30 15:43
閱讀 2072·2019-08-29 13:48
閱讀 2789·2019-08-26 13:55
閱讀 2100·2019-08-23 15:09
閱讀 2895·2019-08-23 14:40
閱讀 3420·2019-08-23 14:23
閱讀 2631·2019-08-23 14:20