开发者问题收集

if 语句无法在 for 循环中运行?

2019-08-26
101

我正在研究 FreeCodeCamp 基本算法脚本部分,但在这一部分上我有点卡住了。

基本上 - 我需要找到一个句子中最长的单词。

  1. 我设置了两个变量, stringArraylongestString
  2. 我将参数中的每个单词设置为数组中的一个项目
  3. 我遍历该数组,如果单词长度比上一个单词长,则将单词长度写入变量 longestString
  4. 我返回变量 longestString

为什么这不起作用?

在评估 longestString.length 时,我不断收到错误:

undefined is not an object

似乎 if 语句未在我的 for 循环中运行。有什么想法吗?

提前致谢!

let stringArray = [];
let longestString;
function findLongestWordLength(str) {
  stringArray = str.split(' ')
  console.log(stringArray);
  for (let i = 0; i <= stringArray.length; i++){
    if (stringArray[i].length > longestString.length){
      longestString = stringArray[i].length
    }
  }
  return longestString
}

findLongestWordLength("The quick brown fox jumped over the lazy dog");

上面的代码产生错误:

"Uncaught TypeError: Cannot read property 'length' of undefined"

3个回答

要修复您的代码,您需要为 longestString 指定一个初始值,在循环中使用 < 而不是 <= ,并分配实际字符串而不是其长度(在 if 内部)

let stringArray = [];
let longestString;
function findLongestWordLength(str) {
  stringArray = str.split(" ");
  longestString = stringArray[0]; // give longestString an initial value
  for (let i = 0; i < stringArray.length; i++) { // use < instead of <=
    if (stringArray[i].length > longestString.length) {
      longestString = stringArray[i]; // assign the string not the length
    }
  }

  return longestString;
}

var result = findLongestWordLength("The quick brown fox jumped over the lazy dog");
console.log(result);

您可以使用这个技巧缩短您的函数:将字符串拆分为一个单词数组,然后按单词长度对其进行排序并选择第一个:

function findLongestWordLength(str) {
  const longest = str.split(" ").sort((a, b) => b.length - a.length)[0];
  return longest;
}

const result = findLongestWordLength("The quick brown fox jumped over the lazy dog");
console.log(result);
Taki
2019-08-26

let longestString; <-- 将其设置为未定义

在您的第一个循环中,您读取它并检查其长度。未定义的值没有长度。

该怎么办?

将其设置为空字符串,或在读取长度之前检查以确保字符串已设置。

因此您可以执行

let longestString = "";

if (!longestString || stringArray[i].length > longestString.length){

或者大多数人会做的将其设置为第一个索引

function findLongestWordLength(str) {
  // Don't define these outside or they will be reused!
  const stringArray = str.split(' ')
  // set to first index
  let longestString = stringArray[0]
  // start loop at 2nd index
  for (let i = 1; i < stringArray.length; i++){
    if (stringArray[i].length > longestString.length){
      longestString = stringArray[i].length
    }
  }
  return longestString
}

const result = findLongestWordLength("The quick brown fox jumped over the lazy dog");
console.log(result)

另一个问题是您在循环中使用 <= 检查了太多索引

epascarello
2019-08-26

需要初始化 longestString 变量

您也可以这样做

let stringArray = [];
let longestString;
function findLongestWordLength(str) {
  stringArray = str.trim().split(' ')
  stringArray = stringArray.sort((a, b) => a.length > b.length ? -1 : (a.length == b.length ? 0 : 1));
  console.log(stringArray)
  return stringArray[0].length
}

let result = findLongestWordLength("The quick brown fox jumps over the lazy dog")
console.log(result)

修复后的解决方案:

let stringArray = [];
let longestString;
function findLongestWordLength(str) {
  stringArray = str.split(' ')
  console.log(stringArray);
  longestString = stringArray[0];
  for (let i = 0; i < longestString.length; i++){
    if (stringArray[i].length > longestString.length){
      longestString = stringArray[i].length
    }
  }
  return longestString
}

let result = findLongestWordLength("The quick brown fox jumped over the lazy dog");
console.log(result)
Dominik Matis
2019-08-26