题解 | #智能提示#
智能提示
http://www.nowcoder.com/practice/efccf73b4ceb4446b6d71127f874e6d3
本来觉得自己字本地能写出个类似功能的就行了,但是看字节面试是用这个平台测的。而且自己测会忽略很多特殊的输入。
需要注意的地方
- 测试代码中的ul是在调用suggest之前获取的,所以在suggest中清空ul就不能采用div直接remove ul的方式,而是老老实实一个一个remove掉li,当然,用jQuery的empty()会方便很多,但是题目中不让用第三方插件。
- 构造匹配的正则表达式的时候,对输入的特殊字符要转义
- input不为空的时候,记得要是没匹配到,要隐藏div
代码
function suggest(items) {
let ipt = document.querySelector('.js-input').value;
let dv = document.querySelector('.js-suggest');
let ul = document.querySelector('ul');
let len = ul.children.length;
// console.log('len', len);
// 清空ul
for (let i = 0; i < len; i++) {
let li = document.querySelector('li');
ul.removeChild(li);
}
// console.log(ul.children.length);
ipt = ipt.trim();
// 输入为空
if (!ipt) {
dv.classList.add('hide');
return;
}
// 构造reg的时候,ipt如果是特殊字符,要转义
let reg = '';
const regKey = ['(', ')', '.', '?', '^', '/', '\\', '*', '[', ']', '|', '+', '{', '}', '$'];
console.log(regKey.length);
for (i of ipt) {
if (regKey.includes(i)) {
i = '\\' + i;
}
reg += i +'.*?';
}
// console.log(reg);
reg = new RegExp(reg);
// 匹配
for (i of items) {
if (reg.test(i)) {
let tip = document.createElement('li');
tip.innerHTML = i;
ul.appendChild(tip);
}
}
dv.appendChild(ul);
// 要考虑ipt不为空但是没有匹配到
if (ul.children.length){
dv.classList.remove('hide');
} else {
dv.classList.add('hide');
}
} 
