首页 > 解决方案 > 断点调试 forEach - JS

问题描述

我正在尝试返回字符串中最后一个单词的长度,目前我正在努力调试。问题在于 forEach 循环我遇到了一个不会更新空数组的断点。

function lengthOfLastWord(s) {
    
let spaces = [];
let space = ' ';
let spaceInd = s.indexOf(space);
while (spaceInd != -1) {
    spaces.push(spaceInd);
    spaceInd = s.indexOf(space, spaceInd + 1);
}

let nonSpaces = [];
let wordArray = [];
for(let i = 0; i<spaces.length; i++) {
    nonSpaces.push((spaces[i + 1] - spaces[i]) - 1);    
}

nonSpaces.forEach(function(number) {
    if (number >= 1) {
        wordArray.push(number);
    }
})

let words = wordArray[wordArray.length - 1];

if ((wordArray.length === 0)) {
    console.log(0);
} else {
    console.log(words);
}
};

lengthOfLastWord("this is my test string");

如果我忽略断点,我会得到正确的结果,但我似乎无法弄清楚为什么空 wordArray 不会更新。

(我确信有一种更简单的方法可以使用过滤器和映射来获得结果,但我想知道我当前的错误代码是否有一个简单的修复)

标签: javascriptdebuggingforeachbreakpoints

解决方案


现在,您的代码似乎返回倒数第二个单词的长度,而不是最后一个单词的长度。问题不在于 forEach,而在于您的操作方式。当您获取字符串中空格的索引并计算每个空格之间的距离时,这会排除第一个和最后一个单词,因为开头和结尾都没有空格。结果,记录倒数第二个单词的长度,而不是最后一个。

简单的解决方法是在while循环之后添加这一行:

spaces.push(s.length);

这将确保最终的字长也将在以下 for 循环中计算。

如您所知,有一种更简单的方法可以做到这一点。

这是一个使用split

function lengthOfLastWord(string) {
    let split = string.trim().split(" ");
    return split[split.length - 1].length
}

推荐阅读