某前端群里出了一个题目:
封装一个charStat函数用于统计给定网址中html源代码中a-z字母(不区分大小写)出现的次数,函数返回Promise并resolve这样一个对象:key为a-z(不可乱序)、value为对应字母出现次数。
为了排除掉网络请求耗时影响,所以我们只优化console.time('ms')与console.timeEnd('ms')之间的代码,保证结果正确的前提下,通过比较输出结果中的ms:后的数值大小来评价优化结果。
执行多次,平均输出大于50ms为E(不及格),在50ms内评分为D等级方案,40ms内为C,30ms内为B,20ms内为A,10ms左右算终极方案了
以下是我的代码,通过String.prototype.replace实现,虽然比较精简但耗时较长(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
}
// 以下是我觉得重点需要优化的部分
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 }
相关分类