前几天学姐跟我讨论了一道题,觉得还挺有意思的。
题目描述:
请使用原生 JavaScript 实现一个方法,判断 html 中出现次数最多的标签,并统计这个次数。
解题思路:
- 取到页面中所有标签,这里是会有重复的;
- 遍历所有标签,统计每个标签出现的次数。
其实统计标签出现的次数很容易想到 key-value 的形式,key 存储标签名,value 存储出现的次数,遍历时发现一个就对 value+1。因此就涉及到了 ES6 一个新的特性 Map 数据结构:阮一峰 ES6教程 Map 数据结构。代码如下:
var bodyNodes = document.body.getElementsByTagName('*'); // 获得所有标签,类型为 object
var map = new Map();
var key; // 所求标签
var max = 0; // 所求最大值
for (let i = 0, len = bodyNodes.length; i < len; i++) {
var ele = bodyNodes[i];
var item = ele.localName; // 标签名
if (map.has(item)) { // map 中已存在该标签
if (max < map.get(item) + 1) { // 加入后次数最大
max = map.get(item) + 1;
key = item; // 保存该标签名
}
map.set(item, map.get(item) + 1); // 替换旧值
}
else { // map 中不存在该标签
map.set(item, 1);
}
}
解题过程中想当然的把 bodyNodes 当成了标签名,实际 bodyNodes 是包含了整个标签的所有属性的一个对象(随意打开的一个网站,东西有点乱,见谅啊)。
然后任意点开一个标签对象,可以找到一个 localName 属性:
整个 map 结构就像这样:
整个解题过程就是这样,其实并不复杂,只是觉得挺有意思的,然后了解了一下 ES6 的 Map 数据结构,所以记录一下。