You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.17 04:06:04