迭代一周的日子

时间:2016-08-14 22:04:38

标签: javascript

我有这段代码可以迭代一组选定的天数,如果今天是所选集合的一部分,我应该响true。但是,isDay响铃false,无论daysChosentoday恰好是什么。那我在这里错过了什么?..

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

更新 好的,这是一些BULL **** !!! ......鉴于today在数组中,这个地球如何评估为真!?...

for (var value of ['Sun','Mon','Tue','Wed','Thu','Fri'])
    {      
      var _day =  (today!=value) ? true : false 
      break;
    }
console.log(_day)

3 个答案:

答案 0 :(得分:2)

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对所有浏览器都不是compatible

答案 1 :(得分:2)

您的代码中存在一些导致问题的主要问题。

  1. public class ParticleField extends JTextField{ private static final long serialVersionUID = -2181907591904112074L; public static int M = 0; public static int X = 1; public static int Y = 2; public static int XV = 3; public static int YV = 4; public static int XP = 5; public static int YP = 6; public static final Font FONT = new Font("SansSerif", Font.BOLD, 24); public Particle p; public int type; public boolean isSelected = false; public boolean wasSelected = false; public ParticleField(Particle p, int t){ this.p = p; this.type = t; setHorizontalAlignment(JTextField.CENTER); setFont(FONT); getDocument().addDocumentListener(new txtDocumentListener(this)); addFocusListener(new txtBoxListener()); getParticleData(); } public Particle getP(){ return p; } public void setParticleData(){ switch (type) { case 0: p.setM(Double.parseDouble(getText())); break; case 1: p.setXM(Double.parseDouble(getText())); break; case 2: p.setYM(Double.parseDouble(getText())); break; case 3: p.setXVM(Double.parseDouble(getText())); break; case 4: p.setYVM(Double.parseDouble(getText())); break; case 5: getParticleData(); break; case 6: getParticleData(); break; } } public void getParticleData(){ setText("swag"); switch (type) { case 0: setText(String.format("%.2f",p.getM())); break; case 1: setText(String.format("%.2f",p.getXM())); break; case 2: setText(String.format("%.2f",p.getYM())); break; case 3: setText(String.format("%.2f",p.getXVM())); break; case 4: setText(String.format("%.2f",p.getYVM())); break; case 5: setText(String.format("%.2f",p.getXPM())); break; case 6: setText(String.format("%.2f",p.getYPM())); break; } } public class txtBoxListener implements FocusListener { @Override public void focusGained(FocusEvent e) { ParticleField t = (ParticleField) e.getSource(); t.isSelected = true; } @Override public void focusLost(FocusEvent e) { ParticleField t = (ParticleField) e.getSource(); t.isSelected = false; t.setParticleData(); } } } - 天数是3个字符,所以你最后得到了额外的空间。 var today=date.toString().substring(0,4),注意额外的空间。

  2. 一旦找到正确的值,你就不会突破你的循环,正如其他答案所指出的那样。

  3. 您只需使用today === "Sun "方法即可。它返回给定字符串的索引,如果它不包含在数组中,则返回-1。

    indexOf

    或修复现有代码:

    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
    

答案 2 :(得分:0)

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

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

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

如果您不想加入polyfill,可以使用我从Codegolf.SE学到的这个技巧:

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

~是二进制NOT运算符,它将数据类型中的位转换为相反的位。当没有搜索项的实例时,从.indexOf()返回的二进制NOT为-1。在JavaScript中有一个称为强制的概念,这意味着当有类型的时候不和谐,就像添加布尔值一样,有一种类型的值会转换为另一种类型。例如,所有非零的数字都被强制转换为true0强制转换为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. 不依赖于字符串。你从字符串中提取的方法会在非英语用户代理中被绊倒,因为他们的日期字符串会有所不同。