「前端每日一问(46)」随便打开一个网站,统计这个网站用过的标签总数

216 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第9天,点击查看活动详情

本题类型:综合题

本题难度:⭐ ⭐

本题考察了:

  • DOM API 的使用熟练度
  • 伪数组转数组
  • 数组去重

如果看了题目没什么思路的可以参考上面的知识点再想想怎么解。

答:

new Set([...document.getElementsByTagName('*')].map(v => v.tagName)).size

把这段代码扔到掘金首页测试一下:

image.png

看了答案,发现确实也不过如此,但是如果突然丢给你这么一个问题,还真不一定能立马写出来。

加大难度:

随便打开一个网页,统计页面中出现最多的三种标签及出现次数。

本题在上一题的基础上,又考察了:

  • 计算数组中每个元素出现的次数
  • 根据数组某一项进行排序
  • Object.entries

答:

const arr = [...document.getElementsByTagName("*")].map(tag=>tag.tagName)
const obj = arr.reduce((pre, i)=>{
  pre[i] = (pre[i] || 0) + 1;
  return pre;
}, {})
const res = Object.entries(obj).sort((a, b)=>(b[1] - a[1])).slice(0, 3)
console.table(res)

image.png

当然,上面的写法使用了 Object.entries 这个 API,如果不使用 Object.entries,换一种写法也是 ok 的,比如像下面这样,用一个新的对象来统计出使用最多的三种标签数量:

const arr = [...document.getElementsByTagName("*")].map(tag=>tag.tagName)
const obj = arr.reduce((pre, i)=>{
  pre[i] = (pre[i] || 0) + 1;
  return pre;
}, {})

const countArr = Object.keys(obj).sort((a,b) => obj[b] - obj[a])
const res = {}
countArr.slice(0,3).forEach(v => {
  res[v] = obj[v]
})
console.log(res)

image.png

结尾

这种题目其实一点也不难,就是看平时业务代码写得熟不熟练,如果平时写东西都是写一步查一个 API,那可能就会被考到。

阿林水平有限,文中如果有错误或表达不当的地方,非常欢迎在评论区指出,感谢~

如果我的文章对你有帮助,你的👍就是对我的最大支持^_^

你也可以关注《前端每日一问》这个专栏,防止失联哦~

我是阿林,输出洞见技术,再会!

上一篇:

「前端每日一问(45)」什么是变量提升和暂时性死区?

下一篇:

「前端每日一问(47)」说一下 JS 的内存管理,举一些内存泄漏的例子。