JavaScript30 爲Wes Bos推出的一項爲期30天的挑戰,旨在幫助人們用純JavaScript來實現效果,初學者若想在JS方面快速精進,不妨一試。如今你看到的是該系列總結的第一篇,不知什麼時候能作完30題,就不在此信誓旦旦立flag了。本題爲第四題。javascript
本章節是爲介紹JS Array的幾個經常使用方法,包含filter(),map(),sort(),reduce(),並在 Console 面板中查看結果。其中文檔已給出兩組數組:java
const inventors = [
{ first: 'Albert', last: 'Einstein', year: 1879, passed: 1955 },
......
{ first: 'Hanna', last: 'Hammarström', year: 1829, passed: 1909 }
];
複製代碼
const people = ['Beck, Glenn', ...... , 'Blake, William'];
複製代碼
過濾操做,篩選符合條件的全部元素,若爲true則返回組成新數組,以第一題爲例:數組
function bornyear(inventor) {
return inventor.year >= 1500 && inventor.year < 1600;
}
var fifteen = inventors.filter(bornyear);
console.table(fifteen);
// 可簡化爲
const fifteen = inventors.filter(inventor => (inventor.year >= 1500 && inventor.year < 1600));
複製代碼
映射操做,對原數組每一個元素進行處理,並回傳新的數組。以第二題爲例:函數
const fullnames = inventors.map(inventor => `${inventor.first} ${inventor.last}`);
console.table(fullnames);
複製代碼
排序操做,默認排序順序是根據字符串Unicode碼點,如10在2以前,而數字又在大寫字母以前, 大寫字母在小寫字母以前。也可以使用比較函數,數組會按照調用該函數的返回值排序,格式以下:oop
function compare(a, b) {
if (a < b) {
// 按某種排序標準進行比較, a 小於 b
return -1;
}
if (a > b) {
return 1;
}
// a must be equal to b
return 0;
}
複製代碼
要比較數字而非字符串,比較函數能夠簡單的以 a 減 b,以下的函數將會將數組升序排列:網站
function compareNumbers(a, b) {
return a - b;
}
複製代碼
針對第三題,咱們就能夠簡單用加減比較:ui
const birthdate = inventors.sort((inventora, inventorb) => (inventorb.year - inventora.year));
console.table(birthdate)
複製代碼
而第七題,則須要按返回值比較:spa
const sortName = inventors.sort((a, b) => {
return (a.last > b.last) ? 1 : -1;
})
console.table(sortName);
複製代碼
歸併操做,總共兩個參數,第一個是函數,能夠理解爲累加器,遍歷數組累加回傳的返回值,第二個是初始數值。若是沒有提供初始值,則將使用數組中的第一個元素。以第四題爲例:code
const totalyears = inventors.reduce((total, inventor) => { return total + (inventor.passed - inventor.year); }, 0);
console.log(totalyears);
複製代碼
reduce()方法講一樣用於第八題:對象
const sumup = data.reduce(function (obj, item) {
if (!obj[item]) {
obj[item] = 0;
}
obj[item]++;
return obj;
}, {});
console.log(sumup);
複製代碼
值得注意的是,回調函數的第一個參數也能夠爲對象,存儲每一類物品的數量。關於對象,如需深刻理解,可參考阮一峯的博客。
參考第六題,題目要求在該網站篩選出含有'de'字節的巴黎大道;首選取得對應節點的元素,並轉化爲數組,再利用.includes()方法就能夠獲得。
const category = document.querySelector('.mw-category');
const links = Array.from(category.querySelectorAll('a'));
const de = links.map(link => link.textContent).filter(streetName => streetName.includes('de'));
console.table(de)
複製代碼
複製代碼