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

JavaScript获取字符串最短单词长度函数异常问题求助

为啥你的最短单词长度函数只在部分场景生效?

嘿,我一眼就瞅出问题所在了——你的sort比较函数返回值不符合JavaScript的要求,这才导致排序结果时对时错。

核心问题:sort比较函数的返回值错误

JavaScript的Array.sort()方法要求比较函数返回负数、0或者正数,分别对应:

  • 负数:a应该排在b前面
  • 0:a和b的相对位置不变
  • 正数:b应该排在a前面

而你的代码里返回的是a.length > b.length,这是个布尔值,会被自动转换成1(true)或者0(false)。比如当a的长度比b短的时候,返回false也就是0,sort会认为两者“相等”,不会交换它们的位置,这就导致数组没有被正确按长度从小到大排序,自然有时候返回的不是最短的单词长度。

看你这段有问题的代码:

const orderedArray = stringArray.sort((a, b) => {
  return a.length > b.length; // ❌ 返回布尔值,不符合sort要求
})

修复方案:修正sort的比较函数

把比较函数改成返回长度的差值就可以了:

function findShort(s) {
  const stringArray = s.split(" ");
  // 正确的比较逻辑:返回长度差值
  const orderedArray = stringArray.sort((a, b) => {
    return a.length - b.length; 
  })
  return orderedArray[0].length;
}

额外优化:处理边缘情况

另外,还要考虑输入字符串里有多个连续空格或者首尾空格的情况,比如输入"hello world ",用split(" ")会得到包含空字符串的数组(["hello", "", "", "world", "", ""]),空字符串的长度是0,会干扰结果。可以用正则分割任意空白,再过滤空字符串:

function findShort(s) {
  const stringArray = s.split(/\s+/).filter(word => word); // 分割任意空白并过滤空串
  const orderedArray = stringArray.sort((a, b) => a.length - b.length);
  return orderedArray[0].length;
}

更高效的实现:不用排序

其实排序的时间复杂度是O(n log n),如果追求更高效率,可以直接遍历数组找出最小长度,时间复杂度是O(n):

function findShort(s) {
  return s.split(/\s+/)
    .filter(word => word)
    .reduce((minLength, currentWord) => Math.min(minLength, currentWord.length), Infinity);
}

这样不管什么场景,函数都能正确返回最短单词的长度啦!

内容的提问来源于stack exchange,提问作者ByteTheBits

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:36:42