首页 > 试题广场 >

智能提示

[编程题]智能提示
  • 热度指数:3035 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
本题展示了一个简化版的搜索框智能提示功能,请按照如下要求完成suggest函数。
1、当输入框的值发生变化时,系统会调用suggest函数,用于显示/隐藏智能提示数据,参数items为一个字符串数组。
2、当items中的字符串和输入框的值匹配时,将匹配的数据依次渲染在ul下的li节点中,并显示.js-suggest节点,否则移除ul下的所有li节点,并隐藏.js-suggest节点
3、输入框的值需要移除两侧空白再进行匹配
4、输入框的值为空时,按照全部不匹配处理
5、字符串使用模糊匹配,比如"北大"能匹配"北大"和"北京大学",但不能匹配"大北京",即按照 /北.*?大.*?/ 这个正则进行匹配
6、通过在.js-suggest节点上添加/移除 hide 这个class来控制该节点的隐藏/显示
7、当前界面是执行 suggest(['不匹配数据', '根据输入框的值', '从给定字符串数组中筛选出匹配的数据,依次显示在li节点中', '如果没有匹配的数据,请移除所有li节点,并隐藏.js-suggest节点']) 后的结果
8、请不要手动修改html和css
9、不要使用第三方插件
10、请使用ES5语法
 input = document.getElementsByTagName('input')[0]
        div = document.getElementsByClassName('js-suggest')[0]
        function suggest(items) {
            let ipt = document.querySelector('.js-input').value.trim();
            var htmlLi = "";
            const regKey = ['(', ')', '.', '?', '^', '/', '\\', '*', '[', ']', '|', '+', '{', '}', '$'];
            console.log(regKey.length);
            var value = "";
            for (i of ipt) {
                if (regKey.includes(i)) {
                    i = '\\' + i;
                }
                value += i + ".*?";
            }
            console.log("123123",value)
            // value = value.replace(/(.)/g, "$1.*?");
            var reg = new RegExp(value)
            items.forEach(element => {
                if (reg.test(element)) {
                    htmlLi +="<li>" + element + "</li>"
                }
            });
            var ul = document.getElementsByTagName("ul")[0]
            ul.innerHTML = htmlLi;
            if (ul.childNodes.length == 0||value=="") {
                div.classList.add('hide')
                ul.innerHTML = ""

            } else {
                div.classList.remove('hide')
            }
           
        }
发表于 2023-11-04 17:32:50 回复(0)
终于有一题我直接通过了,前面的几题都是本地好用,测试不通过,害我找了半天问题。但这题直接拿下!
function suggest(items) {
   let ul = document.getElementsByTagName('ul')[0];
        let jsSuggest = document.getElementsByClassName('js-suggest')[0];
        let jsInput = document.getElementsByClassName('js-input')[0];

        console.log(jsInput);

        let reg = '';
        let keyWord = jsInput.value.trim();
        
        //一共有12个特殊字符
        let special = ['(',')','.','[','{','|','\\','?','+','*','^','$'];
        keyWord.split('').forEach((s) => {
            if(special.includes(s)) {
                s = '\\' + s;
            }
          reg += `${s}.*?`;
        });
        reg = `^.*?${reg}$`;

        items = items.filter((item) => {
            console.log('拼接的正则',reg)
            console.log('匹配的内容',item)
            console.log('',new RegExp(reg).test(item))
          return keyWord.length != 0 && new RegExp(reg).test(item);
        });

        if (items.length != 0) {
          jsSuggest.classList.remove('hide');
          ul.innerHTML = '';
            console.log(jsInput.value,'进入')
          for (let i = 0; i < items.length; i++) {
                let liNew = document.createElement('li');
                console.log(liNew,'新节点')
                liNew.innerHTML = items[i];
                ul.appendChild(liNew);
          }
        } else {
          ul.innerHTML = '';
          jsSuggest.classList.add('hide');
        }
    
}

发表于 2023-03-08 17:27:00 回复(0)
根据用例调试了几遍终于提交成功了!!!
因为用例也考虑了,输入中各种不能被识别的正则表达式的特殊字符,对特殊字符需要进行转义处理!!!
function suggest(items) {
    var input = document.querySelector('.js-input');
    var div = document.querySelector('.js-suggest');
    var ul = document.querySelector('.js-suggest ul');
    var inputValue = input.value.trim(); //移除两侧空白
    
    ul.innerHTML = '';
    // 输入框的值为空时,按照全部不匹配处理
    if(!inputValue){
        div.classList.add('hide');
    }else{
        //字符串和输入框的值匹配
        var str = ''; // 正则表达式
        var istrue = false;
        if(/(\(|\)|\||\.|\?|\*|\+|\\|\[|\])/.test(inputValue.toString())){
            Array.from(inputValue.toString()).forEach(el=>{ 
                str += '\\'+ el+'.*?';
            })
        }else{
            Array.from(inputValue.toString()).forEach(el=>{ 
                str += el+'.*?';
            })
        }
        items.forEach(item=>{
            console.log(item.search(str))
            if(item.search(str)!=-1){
                istrue=true;
                ul.innerHTML += `<li>${item}</li>`;
            }
        })
        
        if(istrue){
            console.log('suggest');
            div.className='js-suggest';
        }else{
            console.log('hide');
            div.classList.add('hide');
        }
    }
}


发表于 2022-02-17 18:22:50 回复(0)
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');
    }
}
发表于 2022-02-12 15:09:14 回复(0)
function suggest(items) {
    var inputEl = document.getElementsByClassName('input')[0];
    var inputVal = inputEl.value.trim();
    var suggestEl = document.getElementsByClassName('js-suggest')[0];
    var isHide = false;
    input.addEventListener('change', inputChange);
    var inputChange = function(e){
        inputVal = e.target.value.trim();
        var regStr = '';
        for(let i=0, arr=inputVal.split('');i<arr.length;i++){
            regStr += `${arr[i]}.*?`;
        }
        let reg = new RegExp(regStr, gi);
        var resItems = items.filter(item => reg.test(item));
        isHide = inputVal === '' || resItems.length === 0;
        if(isHide){
            let liEls = suggestEl.getElementsByTagName('li');
            for(let i=0;i<liEls.length-1;i++){
                suggestEl.children[0].removeChild(liEls[0]);
            }
            suggestEl.classList.add('hide');
        }else{
            suggestEl.classList.remove('hide');
            for(let i=0;i<resItems.length-1;i++){
                let li = document.createElement('li');
                li.innerText = resItems[i];
                suggestEl.children[0].appendChild(li);
            }
        }
    }
}
没跑通过,但是感觉应该没问题?
发表于 2021-12-05 14:39:56 回复(0)