内容
1. 打开一个页面出现多少种标签?
document.getElementsByTagName('*')
1、获取标签名映射为标签名
2、map或者for循环
3、map:nodelist通过展开服务变成数组再map[...document.getElementsByTagName('*')].map(v=>v.nodeName)
> map方法将数组的所有成员依次传入参数函数,然后把每一次的执行结果组成一个新数组返回。
4、去重
5、for或者用es6中的new Set
```
new Set([...document.getElementsByTagName('*')].map(v=>v.nodeName)).size
```
2. 标签出现次数统计?
[...document.getElementsByTagName('*')].map(v=>v.nodeName).reduce((obj,a)=>{ obj[a] = obj[a]?obj[a]+1:1 return obj },{}) //{HTML: 1, HEAD: 1, META: 7, TITLE: 1, LINK: 10, …}
reduce理解:
reduce方法和reduceRight方法依次处理数组的每个成员,最终累计为一个值。
function subtract(prev, cur) {
return prev - cur;
}
[3, 2, 1].reduce(subtract) // 0
[3, 2, 1].reduceRight(subtract) // -4
3. 统计排名
1、把对象变成数组;2、排序sort;3、切片,输出数组前3
let ret = Object.entries([...document.getElementsByTagName('*')].map(v=>v.nodeName).reduce((obj,a)=>{
obj[a] = obj[a]?obj[a]+1:1
return obj
},{}))
ret.sort((a,b)=>b[1]-a[1])
console.log(ret.slice(0,3))
sort:如果该函数的返回值大于0,表示第一个成员排在第二个成员后面;其他情况下,都是第一个元素排在第二个元素前面。在这里,b大于a则排前面,从大到小。
4. vue源码
github下载,src,core,instance,index.js入口(层次深入)