JavaScript的startsWith输出错误,我的代码存在什么坏味道?
问题原因
你当前的代码直接使用完整的用户输入(包含空格后的全部内容)做前缀匹配,而需求是输入带空格时仅用第一个空格前的内容作为匹配依据,自然无法匹配到符合要求的结果。
修改方案
只需要对输入做预处理提取匹配关键词,再调整匹配逻辑即可,修改后的完整代码如下:
var users = [{ name: 'Devgad Mango' }, { name: 'Mantra santra' }, { name: 'Prag Mango' }, { name: 'Pirate aam Mango' }, { name: 'Mango raw' }, ]; function search(input) { // 预处理输入:去除首尾空格后按空格分割,取第一个片段作为匹配关键词,统一转小写避免大小写匹配问题 const matchKey = input.trim().split(' ')[0].toLowerCase(); const matches = []; const reminder = []; users.forEach(user => { // 用户名转小写后判断是否以匹配关键词开头 user.name.toLowerCase().startsWith(matchKey) ? matches.push(user) : reminder.push(user); }); // 匹配结果排序 matches.sort((a, b) => { const aa = a.name.toLowerCase(); const bb = b.name.toLowerCase(); return aa.localeCompare(bb); }); matches.push(...reminder); return matches; } // 注意:原字符串中的反斜杠需要双写才能被正确识别为普通字符 const str = "*-*+&^%$#@!/\\Man santra*"; const cleanedInput = str.replace(/[\/\\#@^!,+()&$~%.'":;*?`<>{}-]/g, ""); console.log(search(cleanedInput));
补充说明
额外修正了原代码中remeinder的拼写错误,排序逻辑改用localeCompare写法更简洁,和原有排序效果完全一致。
按你的示例输入Man santra处理后,会提取关键词Man做匹配,最终会把Mantra santra、Mango raw两个匹配项排序后放在最前面,剩余不匹配项放在末尾,符合要求。
内容的提问来源于stack exchange,提问作者user15950409
相关产品推荐
相关产品推荐

