Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/467.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 未定义,并且可以';我找不到窃听器_Javascript_Arrays_Function_Higher Order Functions - Fatal编程技术网

Javascript 未定义,并且可以';我找不到窃听器

Javascript 未定义,并且可以';我找不到窃听器,javascript,arrays,function,higher-order-functions,Javascript,Arrays,Function,Higher Order Functions,我在程序中找不到bug。标有“Debug 3”和“Debug 6”的console.log都返回未定义的。我相信这是显而易见的,但如果能帮我指出这些问题,我将不胜感激。我还是个新手,所以如果你对我应该采用的不同方式有任何建议,我愿意接受反馈 我知道我本可以写一堆if/else语句,但我真的很想让代码模块化,并尽可能可重用 旁注:我知道我的函数/变量名是垃圾。我计划在程序正常运行后将它们全部重命名。这只是更容易帮助跟踪(虽然显然效果不太好,所以我在这里) 到目前为止,我掌握的代码是: // ---

我在程序中找不到bug。标有“Debug 3”和“Debug 6”的console.log都返回
未定义的
。我相信这是显而易见的,但如果能帮我指出这些问题,我将不胜感激。我还是个新手,所以如果你对我应该采用的不同方式有任何建议,我愿意接受反馈

我知道我本可以写一堆if/else语句,但我真的很想让代码模块化,并尽可能可重用

旁注:我知道我的函数/变量名是垃圾。我计划在程序正常运行后将它们全部重命名。这只是更容易帮助跟踪(虽然显然效果不太好,所以我在这里)

到目前为止,我掌握的代码是:

// ---------------------- 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'));

谢谢,非常感谢您的指导

因此,这里的问题是,您实际上到达了一些
if-else
语句,但没有在该代码块中设置代码

任何时候你在这里得到
未定义的
,都是因为你没有设置
结果

if else
语句不会“失效”,因此一旦有一条语句为真,它将运行该代码块,但不会运行以下代码块

一个很好的例子是您的“debug 3”“Ronald Mcdonald”检查。它进入if-else语句,并点击
has length===2
测试,但在该代码块中,您进行另一个测试,查看它是否包含“Dr.”,如果包含,则将result设置为name,但如果此检查失败,则永远不会将result设置为name


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

我打赌您在某个地方偏离了一条……尝试将代码缩减为一条。这是太多的代码。而且,隐式全局变量是危险的。在nameInverter函数中有一些情况下,结果将保持未定义-例如,如果
checkNameLength(name)==1
CheckIfContainsNorific(name)
为false。。。这只是众多银行中的一家!我敢肯定它就差一个地方了!我很欣赏这个最小的可复制的示例链接,下次我一定会遵循这个链接。很抱歉今天在这里贴了这么多。谢谢!这一点,加上我已经收到的反馈非常有用。我在这里错过了很多台阶/小路。我要回去再检查一遍,确保没有死胡同。
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