有趣的题目 - 找出页面上的所有class

作者: 小菜燕 | 来源:发表于2017-03-25 17:37 被阅读91次

日前,遇见一道有趣的面试题。题目如题,就是找出页面上的所有class。
for example,现在给出一个页面的代码,如下,让你拿到页面上所有的class。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>interview</title>
    <link rel="stylesheet" href="../sass/index.scss">
</head>
<body>
    <div class="container">
        <div class="title rank-title">排行榜标题</div>
        <ul class="rank-list">
            <li class="rank-item">这是排行榜1</li>
            <li class="rank-item">这是排行榜2</li>
            <li class="rank-item">这是排行榜3</li>
            <li class="rank-item">这是排行榜4</li>
            <li class="rank-item">这是排行榜5</li>
            <li class="rank-item">这是排行榜6</li>
            <li class="rank-item">这是排行榜7</li>
            <li class="rank-item">这是排行榜8</li>
        </ul>
        <div class="title name-title name-desc">名字列表</div>
        <ul class="name-list">
            <li class="name"><a href="#" class="name-link">名字1</a></li>
            <li class="name"><a href="#" class="name-link">名字2</a></li>
            <li class="name"><a href="#" class="name-link">名字3</a></li>
            <li class="name"><a href="#" class="name-link">名字4</a></li>
            <li class="name"><a href="#" class="name-link">名字5</a></li>
            <li class="name"><a href="#" class="name-link">名字6</a></li>
        </ul>
    </div>
    <script type="text/javascript" src="../js/jquery-1.12.3.min.js"></script>
    <script type="text/javascript" src="../js/interview.js"></script>
</body>
</html>

有兴趣的小伙伴,可以先试试要怎么做。要解这道题,有几种不同的解法。

思路一

遍历页面上的元素,如果元素有class,则存入数组,最后,对该数组进行去重。

实现方法一

原始简陋的写法,所用到的API分别有:

  • document.getElementsByTagName
  • children
/**
 * 原始写法
 * @param {[JSON]} json [description ]
 * @return {[]}
 */
var arr = [];
function getAllClass(element) {
    var eleClass = element.getAttribute('class');
    if(eleClass && eleClass.length > 0) {
        var eleClassArr = eleClass.split(' ');
        arr = arr.concat(eleClassArr);
    }
    var childrens = element.children;
    if(childrens && childrens.length > 0) {
        var len = childrens.length;
        for(var i=0; i<len; i++) {
            getAllClass(childrens[i])
        }
    }

    return filter(arr);

}

/**
 * 去重
 * @param {[JSON]} json [description ]
 * @return {[]}
 */
function filter(arr) {
    var classArr = [];
    arr.forEach(function(i) {
        if(classArr.indexOf(i) < 0) {
            classArr.push(i)
        }
    })

    return classArr;
}

console.log(getAllClass(document.getElementsByTagName('body')[0]));
实现方法二

改进的写法,用到的API分别有:

  • document.getElementsByTagName
  • children
  • Arrary.prototype.slice.call
  • Set
  • Array.from
var arr = [];
function getAllClass(element) {
    var classes = [];

    if(element.getAttribute('class') !== null) {
        classes = element.getAttribute('class').split(/\s/);
    }

    arr = arr.concat(classes);

    var childrens = element.children;

    Array.prototype.slice.call(childrens).forEach(function(elem){
        getAllClass(elem);
    })

    /**
     * Set对arr里面的class进行去重
     * Array.from 将Set结构变成数组形式
     */
    return Array.from(new Set(arr));
}

getAllClass(document.getElementsByTagName('body')[0]);
实现方法三

改进获取标签的方法。所用到的API有:

  • querySelectorAll

在前面两种方式,都采用了递归来获取标签,但是其实,有个更简便的方式可以获取页面上的所有标签。

var tags = document.querySelectorAll('*')

以上一行代码,就可以获取页面上所有的标签。
因此,根据我们一开始的思路,很快可以得出以下的解法:

/**
 * 获取页面所有class
 * @param {[JSON]} json [description ]
 * @return {[]}
 */
var arr = [];
function getAllClass() {
    var tags = document.querySelectorAll('*');

    tags.forEach(function(elem) {
        if(elem.getAttribute('class')) {
            arr = arr.concat(elem.getAttribute('class').split(/\s/))
        }
    })

    return Array.from(new Set(arr));
}

getAllClass();

思路二

直接获取页面上有class的标签,然后对这类标签进行处理。
那怎么获取页面上有class的标签呢?方法很简单,同样也是通过querySelectorAll这个API。

var tagClasses = document.querySelectorAll('[class]');

通过这句代码,就可以获取页面上的所有带class的标签。
那么,接下来,我们就可以对这些标签进行处理。

var arr = [];
function getAllClass() {
    var tagsClasses = document.querySelectorAll('[class]');

    tagsClasses.forEach(function(elem) {
        arr = arr.concat(elem.getAttribute('class').split(/\s/))
    })

    return Array.from(new Set(arr));
}

后语

几种不同的解法,都使用了新的API,比如SetArray.from等等。如果小伙伴不是很了解的话,建议可以去看看MDN的介绍。

相关文章

  • 有趣的题目 - 找出页面上的所有class

    日前,遇见一道有趣的面试题。题目如题,就是找出页面上的所有class。for example,现在给出一个页面的代...

  • 题目9:找出1000以内的所有完数

    题目: 一个数如果恰好等于它的因子之和,这个数就称为"完数"。例如6=1+2+3.编程找出1000以内的所有完数。...

  • 有趣的题目

    1. 与概率有关的故事 国王决定给一个判了死刑的犯人免死的机会,国王令血犯人将50个白球个50个黑球放进2完全相同...

  • 实现一个 jQuery 的 API

    题目如下: 补全以上代码中的???部分。 题目中要求将所有 div 的 class 添加一个 red,以及将所有 ...

  • sicily_1014 Specialized Four-Dig

    题目链接:http://soj.sysu.edu.cn/1014 题目大意 找出所有在10进制、12进制、16进制...

  • (第1坑)查找文件

    题目:找出指定文件夹中的所有以txt结尾的文件,包括所有嵌套的子文件夹。

  • 有趣的js题目

    中二分法 从已经排好顺序的数组中取出一个数的位置(也可能是插入一个数到排列好的数组中而不打乱顺序) 最大公约数 1...

  • sql练习题

    表结构: 题目:1、 查询Student表中的所有记录的Sname、Ssex和Class列。2、 查询教师所有的单...

  • 08-模拟jQuery实现两个需求

    一、需求如下 题目中要求将所有 div 的 class 添加一个 red,以及将所有 div 的 textCont...

  • NO.31阅读笔记《这样写出好故事》,好情节的重要原则“LOCK

    今日阅读页数第1页-第23页 金句及要点摘抄: 只要把有趣的元素依照特定顺序编排,就能写出更动人的故事。p3 找出...

网友评论

    本文标题:有趣的题目 - 找出页面上的所有class

    本文链接:https://www.haomeiwen.com/subject/xkpznttx.html