某前端群里出了一個題目:封裝一個charStat函數(shù)用于統(tǒng)計給定網(wǎng)址中html源代碼中a-z字母(不區(qū)分大小寫)出現(xiàn)的次數(shù),函數(shù)返回Promise并resolve這樣一個對象:key為a-z(不可亂序)、value為對應(yīng)字母出現(xiàn)次數(shù)。為了排除掉網(wǎng)絡(luò)請求耗時影響,所以我們只優(yōu)化console.time('ms')與console.timeEnd('ms')之間的代碼,保證結(jié)果正確的前提下,通過比較輸出結(jié)果中的ms:后的數(shù)值大小來評價優(yōu)化結(jié)果。執(zhí)行多次,平均輸出大于50ms為E(不及格),在50ms內(nèi)評分為D等級方案,40ms內(nèi)為C,30ms內(nèi)為B,20ms內(nèi)為A,10ms左右算終極方案了以下是我的代碼,通過String.prototype.replace實現(xiàn),雖然比較精簡但耗時較長(98.593ms),并且不及格?。?!const fetch = require('isomorphic-fetch')function charStat (url) { return fetch(url) .then( response => response.text()) .then( html => { console.time('ms') // 聲明一個對象_c,并初始化key為 a-z,value 均為0 let _c = {}, _range = ['a'.charCodeAt(), 'z'.charCodeAt()] for(let i = _range[0]; i <= _range[1]; i ++){ _c[String.fromCharCode(i)] = 0 } // 以下是我覺得重點需要優(yōu)化的部分 html.replace(/[a-z]/ig, i => _c[i.toLowerCase()] ++) console.timeEnd('ms') return _c })}charStat('http://www.sina.com.cn/').then(result => console.log(result))輸出:ms: 98.593ms{ a: 26200, b: 6756, c: 14579, d: 10298, e: 19402, f: 6689, g: 6065, h: 9945, i: 19735, j: 1633, k: 5128, l: 16053, m: 8322, n: 17747, o: 12169, p: 8371, q: 524, r: 13153, s: 18301, t: 22605, u: 5883, v: 4111, w: 4042, x: 2013, y: 3381, z: 575 }
優(yōu)化這個用于統(tǒng)計字母出現(xiàn)次數(shù)的函數(shù),看看你優(yōu)化后的函數(shù)需要耗時幾毫秒?
牧羊人nacy
2019-03-06 14:15:11