-
Notifications
You must be signed in to change notification settings - Fork 2
/
test.html
199 lines (190 loc) · 5.96 KB
/
test.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
</head>
<body>
<script>
/**
* 编码题一:简单实现一个queryString,具有parse和stringify的能力,
* parse,用于把一个URL查询字符串解析成一个键值对的集合。
* 输入:查询字符串 'foo=bar&abc=xyz&abc=123'
* 输出:一个键值对的对象
* {
* foo: 'bar',
* abc: ['xyz', '123'],
* }
* stringify,相反的,用于序列化给定对象的自身属性,生成URL查询字符串。
* 输入:一个键值对的对象
* {
* foo: 'bar',
* abc: ['xyz', '123'],
* }
* 输出:查询字符串 'foo=bar&abc=xyz&abc=123'
*/
const queryString = {
parse(str) {
/* 功能实现 */
console.log('match', Array.from(str.matchAll(/(\w+)=(\w+)/g)));
if (!str) return {};
// const res = {};
// str.split('&').forEach((s) => {
// const [k, v] = s.split('=');
// if (k in res) {
// Array.isArray(s[k]) ? res[k].push(v) : (res[k] = [res[k], v]);
// } else {
// res[k] = v;
// }
// });
// return res;
const res = {};
Array.from(str.matchAll(/(\w+)=(\w+)/g)).forEach((arr) => {
if (arr) {
const k = arr[1];
const v = arr[2];
if (k in res) {
Array.isArray(res[k]) ? res[k].push(v) : (res[k] = [res[k], v]);
} else {
res[k] = v;
}
}
});
return res;
},
stringify(obj) {
/* 功能实现 */
if (!obj) return '';
const resArr = [];
for (let k in obj) {
if (Array.isArray(obj[k])) {
obj[k].forEach((val) => {
resArr.push(`${k}=${val}`);
});
} else {
resArr.push(`${k}=${obj[k]}`);
}
}
return resArr.join('&');
}
};
const queryString1 = {
parse(str) {
/* 功能实现 */
if (!str) return {};
const res = {};
Array.from(str.matchAll(/(\w+)=(\w+)/g)).forEach((arr) => {
if (arr) {
const k = arr[1];
const v = arr[2];
if (k in res) {
Array.isArray(res[k]) ? res[k].push(v) : (res[k] = [res[k], v]);
} else {
res[k] = v;
}
}
});
return res;
}
};
const obj = {
foo: 'bar',
abc: ['xyz', '123']
};
console.log(queryString.stringify(obj));
console.log('parese', queryString.parse('foo=bar&abc=xyz&abc=123'));
/**
* 编码题二:数组按嵌套层次输出
* 说明:给定一个嵌套数组,输出每层的内容
* 示例:
* parseArrayLevels([1, [3, ['x', 'y'], 2], [[5], 'a']]);
* // 输出 [[1,2], [3, 2, 'a'], ['x', 'y', 5]]
*/
function parseArrayLevels(arr) {
console.log('arr.to', arr.toString());
/** 代码实现 */
if (!arr) return;
const res = [];
function track(list, dep) {
if (Array.isArray(list)) {
list.forEach((val) => {
track(val, dep + 1);
});
} else {
res[dep] ? res[dep].push(list) : (res[dep] = [list]);
}
}
track(arr, -1);
return res;
}
console.log('p arr', parseArrayLevels([1, [3, ['x', 'y'], 2], [[5], 'a']]));
/**
* 编码题三:字符串压缩
* 说明:将字符串中连续出席的重复字母进行压缩,并输出压缩后的字符串。
* 压缩规则:
* 1、仅压缩连续重复出现的字符。比如字符串“abcbc”由于无连续重复字符,压缩后的字符串还是”abcbc”
* 2、压缩字段的格式为”字符重复的次数+字符”
* 示例:
* stringZip('cccddecc'); // '3c2de2c'
* stringZip('adef'); // 'adef'
* stringZip('aaaaa'); // '5a'
*/
function stringZip(str) {
/** 代码实现 */
if (!str) return str;
console.log('m', Array.from(str.matchAll(/(\w)(\1+)?/g)));
// console.log('m', str.match(/(\w+)\1/));
// 末尾添加一位非字母可以将处理结尾的逻辑和前面的统一
str += '#';
let stack = [];
const length = str.length;
let i = 0;
let res = '';
while (i < length) {
const char = str[i];
if (stack.length) {
const top = stack[stack.length - 1];
if (top === char) {
stack.push(char);
} else {
res += `${stack.length === 1 ? '' : stack.length}${top}`;
stack = [char];
}
} else {
stack.push(char);
}
i++;
}
return res;
}
function stringZip(str) {
if (!str) return str;
return Array.from(str.matchAll(/(\w)(\1+)?/g))
.map((mt) => {
if (mt) {
const str = mt[0];
const char = mt[1];
return `${str.length === 1 ? '' : str.length}${char}`;
} else {
return '';
}
})
.join('');
}
console.log(stringZip('cccddecc'));
console.log(stringZip('adef'));
console.log(stringZip('aaaaa'));
function debounce(fn, t, content) {
let timer;
return function () {
clearTimeout(timer);
timer = setTimeout(() => {
fn.call(content);
}, t);
};
}
</script>
</body>
</html>