面试奇遇 -- 原生JS

最近几日去参加一些面试,多多少少有一些收获。

现将遇到的一些面试题,做一下分析和总结。


1、使用原生JS,不能使用递归,查找dom中所有以“<com-”开头的自定义标签tagName。

 1 <!DOCTYPE html>
 2 <html lang="zh">
 3 
 4     <head>
 5         <meta charset="UTF-8" />
 6         <meta name="viewport" content="width=device-width, initial-scale=1.0" />
 7         <meta http-equiv="X-UA-Compatible" content="ie=edge" />
 8         <title>DOM获取自定义标签</title>
 9     </head>
10 
11     <body>
12         <con-1>con11</con-1>
13         <con-2>con22</con-2>
14         <con-3>con33</con-3>
15 
16         <p>p11</p>
17         <p>p12</p>
18         <p>p13</p>
19         <p>p14</p>
20 
21         <com-1>com11</com-1>
22         <com-2>com12</com-2>
23         <com-3>com13</com-3>
24 
25         <script type="text/javascript">
26             //获取body下的所有内容,结果为字符串
27             var str = document.getElementsByTagName('*')[0].innerHTML;
28             console.log(str);
29 
30             //使用正则表达式,用于匹配字符串中对自定义标签
31             var reg = /<com-.*>.*<\/com-.*/g;
32 
33             //利用字符串对象的match()方法并结合正则,获取字符串str中匹配的正则子串,结果为数组
34             var res = str.match(reg);
35 
36             console.log(res);
37 
38             /*
39 
40             输出的结果:
41             <com-1>com11</com-1>
42 
43             <com-2>com12</com-2>
44 
45             <com-3>com13</com-3>
46              */
47         </script>
48     </body>
49 
50 </html>

2、将一个多维对象转换为二维对象:

    // 封装一个函数,使得对象obj转换后的结果为objTo的形式         

        var obj = { "data": { "err": 1, "msg": "错误" }, "list": ["a", "b"], "request_id": "geo5-esd1-efor-veuq" }; var objTo = { "data.err": 1, "list.0": "a", "list.1": "b", "reuqest_id": "geo5-esd1-efor-veuq" };

js代码如下:

<script type="text/javascript">
            var obj = {
                "data": {
                    "err": 1,
                    "msg": "错误"
                },
                "list": ["a", "b"],
                "request_id": "geo5-esd1-efor-veuq"
            };
            var objTo = {
                "data.err": 1,
                "list.0": "a",
                "list.1": "b",
                "reuqest_id": "geo5-esd1-efor-veuq"
            };

            //封装函数
            function toObj(obj) {
                var newObj = {};

                for(let pro in obj) {
                    if(obj[pro].push != undefined) {
                        for(let i = 0; i < obj[pro].length; i++) {
                            newObj[pro + '.' + i] = obj[pro][i];
                        }
                    } else if(typeof obj[pro] == 'object') {
                        for(let j in obj[pro]) {
                            if(obj[pro][j] == '错误') {

                            } else {
                                newObj[pro + '.' + j] = obj[pro][j];
                            }
                        }
                    } else {
                        newObj[pro] = obj[pro];
                    }
                }
                return newObj;
            }
            console.log(toObj(obj));
        </script>

3、写一种方法:将一个维度比较高的对象转换为GET参数模式(URL地址拼接的带有参数的字符串)

该方法写的有点乱,如果有哪位大神有更优的解决方法,希望共勉!

<!DOCTYPE html>
<html>

    <head>
        <meta charset="UTF-8">
        <title>对象转换为URL参数</title>
    </head>

    <body>
        <script type="text/javascript">
            var obj = {
                "openid": "123456",
                "userinfo": {
                    "name": "小明",
                    "sex": "",
                    "tags": ["读书", "游戏", "旅行"],
                    "settings": {
                        "theme": "white",
                        "signature": "好好学习天天向上",
                        "size": 16
                    }
                },
                "status": 200
            };

            //封装函数
            function toURL(obj) {
                var str = '?';

                for(var key in obj) {
                    if(key == 'status') {

                    } else {
                        //判断数据类型
                        var type = typeof(obj[key]);
                        //基本类型数据拼接
                        if(type == 'string' || type == 'number' || type == 'boolean') {
                            str += key + '=' + encodeURIComponent(obj[key]) + '&';
                        } else if(type == 'object') {
                            //对象类型判断
                            for(var pro in obj[key]) {
                                var type2 = typeof(obj[key][pro]);
                                if(type2 == 'string' || type2 == 'number' || type2 == 'boolean') {
                                    str += key + '.' + pro + '=' + encodeURIComponent(obj[key][pro]) + '&';
                                } else if(type2 == 'object') {
                                    //判断对象数据是否为数组
                                    if(obj[key][pro] instanceof Array) {
                                        var arr = obj[key][pro];
                                        var strs = '';
                                        for(var k = 0; k < arr.length; k++) {
                                            strs += encodeURIComponent(strArr[k]);
                                        }
                                        str += strs;
                                    } else {
                                        for(var pros in obj[key]) {
                                            str += 'obj' + '.' + key + '=' + encodeURIComponent(obj[key][pro]) + '&';
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
                //处理字符串末尾的&字符
                str = str.substring(0, str.length - 1);
                console.log(str);
            }
            toURL(obj);

        </script>
    </body>

</html>

猜你喜欢

转载自www.cnblogs.com/zxk5211/p/sk_20180807.html