未定义,找不到错误

Getting undefined, and can't find the bug

我无法找到程序中的错误。标记为“调试 3”和“调试 6”的 console.logs 都返回了 undefined。我敢肯定这很明显,但是任何指出它们的帮助将不胜感激。我还很新,所以如果你对我应该这样做的不同方式有任何建议,我愿意接受反馈!

我知道我可以只写一堆 if/else 语句,但我真的很想诚实地尝试使代码模块化,并尽可能地可重用。

旁注:我知道我的 function/variable 名字很垃圾。我计划在程序正常运行后将它们全部重命名。这只是更容易帮助跟踪(虽然显然效果不是很好,因此我来了)。

我目前的代码是:

// ---------------------- INPUT CHECKS ---------------------- //

// Check and return the number of words supplied in the name
const checkNameLength = (name) => {
  arr = name.split(' ');
  return arr.length;
};


// Checks if the name contains any spaces on the edges
const checkForSpacesOnEdges = (name) => {
  if (name[0] === ' ' || name[-1] === ' ') {
    return true;
  } else {
    return false;
  }
};


// Checks if the name contains an honorific
const checkIfContainsHonorific = (name) => {
  let accumulator = 0;
  let result;
  for (let i = 0; i < name.length; i++) {
    if (name[i] === '.') {
      accumulator++;
    }
  }
  if (accumulator !== 0) {
    result = true;
  } else {
    result = false;
  }
  return result;
};


// Returns a 1 word string 
const isSingleName = (name) => {
  let result;
  let arr = name.split(' ');
  if (arr.length === 1) {
    result = true;
  } else {
    result = false;
  }
  return result;
};


// ---------------------- OUTPUT ---------------------- //

// Return empty string
const emptyOutput = (name) => {
  return 'empty string';
};


// Returns the exact string provided by user
const returnAsIs = (name) => {
  return name;
};


// Returns the name with trailing spaces removed
const returnWithoutSpaces = (name) => {
  return name.trim();
};


// Reverses the name string and returns it
const normalReverse = (name) => {
  let arr = [];
  let result;
  arr = name.split(' ');
  arr.reverse();
  result = arr[0] + ', ' + arr[1];
  result.toString();
  return result;
};


// Reverses the first and last name, but leaves the honorific in front
const hasHonorificReverseNames = (name) => {
  let arr = name.split(' ');
  let firstAndLastArr = [];
  for (let i = 1; i < arr.length; i++) {
    firstAndLastArr.push(arr[i]);
  }
  firstAndLastArr.reverse();
  return arr[0].toString() + firstAndLastArr[0].toString() + ', ' + firstAndLastArr[1].toString();
};


// Main func
const nameInverter = (name) => {
  let result;
  if (!name) {
    result = emptyOutput(name);

  } else if (isSingleName(name)) {
    result = returnAsIs(name);
    
  } else if (!checkIfContainsHonorific(name)) {
    if (checkForSpacesOnEdges(name)) {
      result = returnWithoutSpaces(name);
    }

  } else if (checkNameLength(name) === 1) {
    if (checkIfContainsHonorific(name)) {
      result = emptyOutput(name);
    }
    
  } else if (checkNameLength(name) === 2) {
    console.log("Flag 1: ", name);
    if (!checkIfContainsHonorific(name)) {
      console.log("Flag 2: ", name);
      result = name;
    }
    
    
  } else if (checkNameLength(name) === 2) {
    if (checkIfContainsHonorific(name)) {
      result = returnAsIs(name);
    }
    
  } else if (checkNameLength(name) === 3) {
    if (checkIfContainsHonorific(name)) {
      result = hasHonorificReverseNames(name);
    }

  } else {
    return normalReverse(name);
  }
  return result;
};


console.log("Debug 1", nameInverter(''));
console.log("Debug 2", nameInverter('Ronald'));
console.log("Debug 3", nameInverter('Ronald McDonald'));
console.log("Debug 4", nameInverter(' Ronald McDonald '));
console.log("Debug 5", nameInverter('Dr. Ronald McDonald'));
console.log("Debug 6", nameInverter('Dr. Ron'));

我从那些 console.logs 获得的输出(包括我怀疑导致问题的函数中的 Flag 1 console.log,如下所列:

Debug 1 empty string
Debug 2 Ronald
Debug 3 undefined
Debug 4 Ronald McDonald
Debug 5 Dr.McDonald, Ronald
Flag 1:  Dr. Ron
Debug 6 undefined

谢谢,非常感谢任何指导!

所以你在这里遇到的问题是你实际上到达了你的一些 if else 语句,但是没有在该代码块中设置代码。

任何时候你得到 undefined 是因为你没有设置 result 任何东西。

if else 语句不会 'fall through' 所以一旦一个为真,它就会 运行 该代码块,而不是下面的块。

您的 'debug 3' 'Ronald Mcdonald' 支票就是一个很好的例子。它进入您的 if else 语句,并命中 has length === 2 测试,但随后在该代码块中,您进行另一项测试以查看它是否包含 'Dr.',如果包含则将结果设置为名称,但是如果此检查失败,则您永远不会将结果设置为名称。

基本上,您要么需要对 if else 语句进行排序,以便可以按顺序检查它们并且它们不会发生冲突,要么您需要在这些长度检查中嵌套额外的 if else 语句以检查其他内容你想。