迭代一周中的每一天

Iterating the days of the week

本文关键字:每一天 一周 迭代      更新时间:2023-09-26

我有这段代码,它迭代选定的一组日期,如果今天是选定的一组的一部分,则应该调用true。然而,无论daysChosentoday是什么,isDay都会环住false。那么我在这里遗漏了什么呢?

var date = new Date;
var isDay;
var today=date.toString().substring(0,4)
//console.log(today)//good
for (var daysChosen of ['Sun','Mon','Tue','Wed','Thu'])
{
  console.log(daysChosen)//good
   isDay = today==daysChosen ? true : false
}
console.log(isDay)//bad, should be true if today is part of daysChosen

更新:好吧,这是一些牛****!!

如果today在数组中,这怎么可能为真呢?
for (var value of ['Sun','Mon','Tue','Wed','Thu','Fri'])
    {      
      var _day =  (today!=value) ? true : false 
      break;
    }
console.log(_day)

您的代码中有几个主要问题。

  1. var today=date.toString().substring(0,4) -天是3个字符长,所以你得到额外的空间在最后。today === "Sun ",注意多余的空间

  2. 你没有跳出你的循环,一旦你找到正确的值,正如其他答案所指出的。


您可以简单地使用indexOf方法。它返回给定字符串的索引,如果该字符串不包含在数组中,则返回-1。

var date = new Date();
// first 3 characters from string for day of week
var today = date.toString().substring(0,3);
var days = ['Sun','Mon','Tue','Wed','Thu'];
var isInDays = days.indexOf(today) > 0; // indexOf returns -1 if not contained

或修复您现有的代码:

var date = new Date;
var isDay;
var today=date.toString().substring(0,3)
//console.log(today)//good
for (var daysChosen of ['Sun','Mon','Tue','Wed','Thu'])
{
    console.log(daysChosen)//good
    isDay = today==daysChosen ? true : false
    if(isDay) break; // must break once you find it or you will keep overriding the value.
}

isDay变成true时,循环继续循环,在下一个迭代中可以将false赋值给它。您可以使用break语句退出循环:

var isDay = false;
for (var daysChosen of ['Sun','Mon','Tue','Wed','Thu'])
{
    if (today == daysChosen) {
        isDay = true;
        break;
    }
}

您也可以使用array .prototype.find()函数来检查数组中是否包含today。(!!是双重否定):

var isDay = !!['Sun','Mon','Tue','Wed','Thu'].find(function(day) {
    return day === today;           
})

遗憾的是find不兼容所有浏览器

如果你有一个数组的东西,并想检查它是否有东西,我会使用新的.includes()属性数组:

["Sun", "Mon", "Tue", "Wed", "Thu"].includes(today);

另外,不要从字符串输出中提取星期几,而是使用Date.prototype.getDay()


如果你不想包含polyfill,你可以使用我从Codegolf学到的这个技巧。SE:

~["Sun", "Mon", "Tue", "Wed", "Thu"].indexOf(today);

~是一个二进制NOT操作符,它将数据类型中的位转换成相反的位。当没有搜索项的实例时,从.indexOf()返回-1的二进制NOT为0。在JavaScript中有一个叫做强制的概念,意思是当类型不协调时,比如添加布尔值,一种类型的值会转换成另一种类型。例如,所有非零的数字都强制转换为true, 0强制转换为false。因此,如果您将上述文本放入if语句中,它将像.includes()语句一样运行。


一个更好的方法

您正在从Date.toString()中提取星期几,这不是一个好的实践。考虑使用数组访问和Date.prototype.getDay()使这个过程更加合乎逻辑:

let today = new Date().getDay();
//   Sun., Mon., Tue., etc.
if ([true, true, true, true, true, false, false][today]) {
  // Day is matched
} else {
  // Day is not matched
}

这有一些优点

  1. 最终的可定制性。您可以精确指定要匹配的日期
  2. 不依赖字符串。您从字符串中提取的方法将在非英语用户代理中出错,因为他们的日期字符串将不同。