最近几日去参加一些面试,多多少少有一些收获。
现将遇到的一些面试题,做一下分析和总结。
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>