未定义,找不到错误
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 语句以检查其他内容你想。
我无法找到程序中的错误。标记为“调试 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 语句以检查其他内容你想。