【问题标题】:Why is this if statement not affected by my input?为什么这个 if 语句不受我的输入影响?
【发布时间】:2022-10-23 12:13:57
【问题描述】:

我想构建一个将 AM/PM 转换为 24 小时格式的算法。它还没有完成,但我到目前为止的代码表现得很奇怪。

当我输入"25:05:45PM" 时,它应该进入第一个if 语句的第一个分支,但应该不是输入第二个if 语句。我检查了条件,肯定是false。我的大脑正在融化。

这是代码:

function conversionTime(s) {
  if (s.includes('PM')) {
    let temp = s.slice(0, 8).split(':');
    if (temp[0] >= 01 && temp[0] <= 12); {
      temp[0] = Number(temp[0]) + 12;
      return temp.join(':')
    }
  } else if (s.includes('AM')) {
    let temp2 = s.slice(0, 8).split(':');
    return temp2
  }
}
console.log(conversionTime("25:05:45PM"))

【问题讨论】:

  • 一个if (s.includes('AM'))里面if (s.includes('PM')) 对我来说听起来没那么有用,除非你的字符串包含两个都AMPM。那可能是你的问题。
  • 嗨@wizzwizz4,我刚刚编辑了我的函数,感谢您的注意,我搞砸了```。
  • @CherryDT 不,不是这样;在return temp.join(':') 之后隐藏了一个}
  • 哦...好吧,这个故事的寓意是:伙计们,正确缩进和格式化你的代码!为了你自己的理智和所有试图帮助你的人。
  • 是的,对不起,我搞砸了,我正在努力学习拥有最干净的代码,我保证我的下一个问题将是完美的@CherryDT

标签: javascript if-statement


【解决方案1】:

Gotcha.

if (temp[0] >= 01 && temp[0] <= 12);

这个分号是罪魁祸首!它的意思是“if 语句已经结束,不需要做任何事情”,所以你的代码被解释为:

if (temp[0] >= 01 && temp[0] <= 12);

{
  temp[0] = Number(temp[0]) + 12;
  return temp.join(':');
}

块中的代码将始终运行。存在此功能,因此您可以充分利用 let 的作用域:

let x = "outside";
console.log(x);
{
  let x = "inside";
  console.log(x);
}
console.log(x);

出色地,真的它的存在是因为 C 语言就是这样工作的——它早于let 语句——但这就是它对这些日子有用的东西。

【讨论】:

  • ...我比你想象的更爱你,你打开了我的心扉。如果我能竖起大拇指你的回应,我会的。太感谢了 !
  • @StefancicSamuel 如果它解决了您的问题,您可以接受它(投票箭头下方的勾号)。尽管您的算法确实存在一些其他问题,但您可能已经注意到了。
  • 如果您自己无法解决这些问题(我相信您至少可以解决其中的一些问题!),请提出一个单独的问题。随时在此处发布指向它的链接。
  • 哦是的 !我忘记了。是的,我还有一些话要说,我很乐意在做的时候失败,但我会从中学到很多东西,所以我还不想知道它们:)
  • 好吧 !如果我遇到一些问题,我会明确地创建新帖子并添加链接以了解我们已经创建的路径:)
【解决方案2】:

我会这样做..

function conversionTime(timeAPM)
  {
  let [h,m,s,apm] = timeAPM.match(/(d+)|(w+)/g);  

  if (timeAPM !== `${h}:${m}:${s}${apm}`
   || isNaN(h) || isNaN(m) || isNaN(s) 
   || (apm !== 'AM' && apm !== 'PM')    
   ) return undefined;

  if (apm === 'PM' && h <= 12 ) h = +h +12;
  return `${h}:${m}:${s}`;
  }

console.log(conversionTime("25:05:45PM"))

我不知道这是否是他故意的,但 PO 的代码也返回 undefined。除了他对AM/PM 标签的依附之外,OP 没有对条目的有效性做出解释。

所以第二个版本内容是检查确实有3 数值,用: 分隔,然后直接跟AMPM

这些数字的位数未知:他的测试使用一个小时 = 25,而它是一个 AM/PM 演示文稿。那么为什么不用40 数字表示秒或分钟...

我并不是说我的正则表达式是宇宙中最好的。

我也可以在我的代码中添加:

console.log(conversionTime("10:31:25BAM")) // -> undefined
console.log(conversionTime("1:3:5abc"))    // -> undefined
console.log(conversionTime("1:3zzzz"))     // -> undefined
console.log(conversionTime("a:10:15PM"))   // -> undefined
console.log(conversionTime("285::4875PM")) // -> undefined
// or more absurd:
console.log(conversionTime("285:1505:4875PM")) // -> 285:1505:4875

【讨论】:

  • 谢谢 !我想知道正则表达式的使用,但我还有一些工作要做才能完全理解你的代码:)
  • @StefancicSamuel 这段代码只是你现在所拥有的复杂版本——除了它在两种情况下(上午和下午)都返回一个字符串;您的版本中的一个简单修复,除了那是无论如何都是错误的行为.它包含您的所有其他错误,并且(imo)没有您已经拥有的那么清楚; Object.assign 位是肯定的奥术,如果正则表达式更合理,isNan 检查将完全没有必要。
  • 我建议将/(dd):(dd):(dd)(AM|PM)/.exec(timeAPM)(未经测试)作为正则表达式;如果使用空检查,那将更短、更简单、更清晰。如果您想接受262:1:25PM 之类的内容,请酌情设置为d+d*
  • @wizzwizz4 我为你添加了一些解释,
最近更新 更多