有没有办法缩短大部分重复的 if 语句?

Is there a way to shorten a mostly repetitive if statement?

我正在尝试将数字转换为月份。我正在尝试使用 if 语句来做到这一点,例如if(num===0) {month = "January";} else if(num===1) {month = "February";} 等等。有没有办法缩短这个?我想应该是 if(num===[0,1,2,3,4,5]) {month = ["January", "February", "March", "April", "May", "June"}

换句话说,是否有某种方法可以使用带有 if 函数的数组,而 if 函数分别遍历每个数组?顺便说一句,如果这有什么不同的话,我正在使用 p5 库。

您可以使用 switch 语句

var num = 0;
  switch (num) {
    case 0:
      month = "January";
      break;
    case 1:
      month = "February";
      break;
    case 2:
      month = "March";
      break;
    case 3:
      month = "April";
      break;
    case 4:
      month = "May";
      break;
    case 5:
      month = "June";
      break;
    default:
      day = "Unknown Month";
  }

阅读更多:https://www.w3schools.com/jsref/jsref_switch.asp https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/switch

创建一个awk定义如下:

getMonth()
{
    awk 'BEGIN{
        months=[January,February,March,April,May,June,July,August,September,October,November,December] ;
    }{
        print months[] ;
    }'
}

然后使用调用处理您的输入

month=`echo ${digit} | getMonth `

其中 digit 被分配了一个从 1 到 12 的值。

有比硬编码开关更好的方法。

let locale = 'en-us'

let month = 3 // Apr

let months = [...Array(12).keys()].map(v => new Date(2000, v).toLocaleString(locale, {
  month: 'long'
}))

if (months[month]) {
  console.log('Do something...')
}

// some other examples

let result;

//
result = months[month] || 'Invalid month index'
console.log('by index', result)

//
result = months[month - 1] || 'Invalid month number'
console.log('by month number', result)

//
result = months.findIndex(v => v === new Date().toLocaleString(locale, { month: 'long' }))
console.log('find index by name', result)
console.log('use index to get name', months[result])

如果您的范围在本质上大部分是连续的,一种方法是预先制作一个同时也是键和值的查找字符串,例如

1:JAN:2:FEB:3:MAR: etc

具有恒定宽度的性质。甚至 1:J:2:F:3:M:4:A….(我的意思是 可行 在那里输入所有的名字,但是你需要一些填充)。

当 then 函数被调用时,使用 match 或 substring 函数的组合来“剪掉”你首先需要的那些,比如“4:APR:5:MAY:6:JUN:7:JUL”(当你每个使用单个字母时,当 3-5、4-8 和 1-6-7 重复时,你必须用你自己的符号来发挥创造力……或者只使用 base-12)

如果 3 个字母的前缀已经满足你的需要,那么做一个高速 gsub 来去掉所有的数字和分隔符,并将它们更改为逗号或其他东西。

如果你选择完整的月份,我不知道它会有多大帮助,但也许你可以一次将 9-10-11-12 的常见后缀中的正则表达式子化,并且还有1-2。 5已经是它的全名了。

另一种方法是,如果您的范围通常跨越半年以上,那么即使是“减法”方法也可能比“加法”方法更可取 - 总是从完整的字符串开始,拼写出所有月份。然后,对于您输入中缺少的月份,将其空白,然后 return 剩下的。

并说如果你的范围倾向于在一年的同一半年内聚集而不是跨界,那么你甚至可以将该索引键拆分为 2 以使其更快(虽然节省很少)

我认为最好的解决方案是使用这样的月份数组:

const month = [
    "January",
    "February",
    "March",
    "April",
    "May",
    "June",
    "July",
    "August",
    "September",
    "October",
    "November",
    "December"
];

const answer = month[num];