javascript将循环数组的函数传递给使用switch语句日期方法的函数

时间:2016-03-17 18:02:08

标签: javascript arrays function date switch-statement

我正在尝试创建一个循环遍历数组并返回结果的函数。我试图将此函数传递给另一个函数,该函数使用switch语句来检查从传入函数返回的值的日期,以显示星期日,星期三等星期几到控制台。数组中的所有三个值都是字符串,其中两个是日期值,而另一个不是。

我显然遗漏了一些内容,因为myDate函数只返回一个值,即数组中的第一个值,当它传递给findDate函数时,它也不会返回预期的结果。

var myDate = function() {
  var input = ['10/11/2009', '11/10/2010', '-1'];

  for (var i = 0; i < input.length; i++) {
    var result = input[i];
    console.log(result);
      return result;

   }
};

console.log(myDate());

function findDay(myDate) {
    if (myDate !== -1) {
        var date = new Date(myDate), day = "";
        switch (date.toDateString().slice(0,3)) { //Pick the first 3 characters of a date string
            case "Sun":
                day = "Sunday";
                break;
            case "Mon":
                day = "Monday";
                break;
            case "Tue":
                day = "Tuesday";
                break;
            case "Wed":
                day = "Wednesday";
                break;
            case "Thu":
                day = "Thursday";
                break;
            case "Fri":
                day = "Friday";
                break;
            default:
                day = "Saturday";
                break;
        }
        console.log(day);
    }
    else{
        console.log(myDate + ' is not a valid date'); //If input is -1
    }
}

findDay(myDate);

示例输入

10/11/2009
11/10/2010
-1

示例输出

    Sunday
    Wednesday
    -1 is not a valid date

5 个答案:

答案 0 :(得分:2)

如果myDate函数用于将其他函数(findDay)应用于输入列表,则需要如下所示:

var myDate = function( callback) {
  var input = ['10/11/2009', '11/10/2010', '-1'];

// loop through list and apply callback to EACH item
  for (var i = 0; i < input.length; i++) {
    callback(input[i]);
  }
};


function findDay(dateString) {
    if (dateString != -1) {
        var date = new Date(dateString), day = "";
        switch (date.toDateString().slice(0,3)) { //Pick the first 3 characters of a date string
            case "Sun":
                day = "Sunday";
                break;
            case "Mon":
                day = "Monday";
                break;
            case "Tue":
                day = "Tuesday";
                break;
            case "Wed":
                day = "Wednesday";
                break;
            case "Thu":
                day = "Thursday";
                break;
            case "Fri":
                day = "Friday";
                break;
            default:
                day = "Saturday";
                break;
        }
        console.log(day);
    }
    else{
        console.log(dateString + ' is not a valid date'); //If input is -1
    }
}

myDate(findDay);

然后你只需要稍微修改find​​Day,以便它可以在你给它的每个日期字符串上工作。这是一个例子,如果这是你的想法:

https://jsfiddle.net/2mnxcpwt/

答案 1 :(得分:1)

你的逻辑不清楚。通常你有一个函数,它是一个回调函数,也是一个为每个元素调用回调的数组的迭代器。例如:

&#13;
&#13;
var input = ['10/11/2009', '11/10/2010', '-1'],
    output = input.map(findDay); // iterator with callback

function findDay(myDate) { // callback
    var date, 
        days = { Sun: 'Sunday', Mon: 'Monday', Tue: 'Tuesday', Wed: 'Wednesday', Thu: 'Thursday', Fri: 'Friday', Sat: 'Saturday' };
    if (myDate !== '-1') { // <-- changed to string!
        date = new Date(myDate);
        return days[date.toDateString().slice(0, 3)];
    }
    return myDate + ' is not a valid date';
}

document.write('<pre>' + JSON.stringify(output, 0, 4) + '</pre>');
&#13;
&#13;
&#13;

答案 2 :(得分:1)

我认为主要问题是,您检查了 await ScannedCode.AddAsync().ConfigureAwait(false); 是否在数组中为if (myDate !== -1) {设置了myDate的值。所以你想比较一个字符串和一个数字。

除上述问题外,我已将任务打包在一个函数中:

[..., '-1']

https://jsfiddle.net/nrp24x0w/

测试功能

答案 3 :(得分:0)

首先,你的数组是:

 ['10/11/2009', '11/10/2010', '-1']

以后你有:

 if (myDate !== -1)

由于数组包含一个字符串而您正在检查数字,因此永远不会成立。

接下来,在你的循环中,你有:

for (var i = 0; i < input.length; i++) {
  var result = input[i];
  console.log(result);
    return result;
}

这里有两个问题:

  1. return语句在循环中,导致循环终止 在第一次迭代时。

  2. 在循环内部,正在使用旧的result值 抛出并使用最新的循环迭代值重新初始化result变量。

  3. 你应该:

    var myDate = function() {
    var input = ['10/11/2009', '11/10/2010', '-1'];
    var result;
    
    for (var i = 0; i < input.length; i++) {
      result += input[i];
    }
    console.log(result);
    return result;
    

    现在,你说&#34;我正在尝试创建一个循环数组并返回结果的函数。&#34;但是,你还没有说过应该如何打包这些结果。你想要什么?分隔列表?另一个阵列?你考虑过了吗?

    input.forEach(function(){ . . . });
    

    https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach

    或者:

    var resultArray = input.map(function(){ . . . });
    

    https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map

    由于您似乎只是想检查数组,因此不清楚为什么需要第二个数组或第二个函数,但这是一个完成主要工作的示例:

    &#13;
    &#13;
    function checkArray(arr){
      
      arr.forEach(function(value, index, arr){
          if (value !== -1) {
    
            var d = new Date(value), day = "";
    
            switch (d.toDateString().slice(0,3)) { //Pick the first 3 characters of a date string
                case "Sun":
                    day = "Sunday";
                    break;
                case "Mon":
                    day = "Monday";
                    break;
                case "Tue":
                    day = "Tuesday";
                    break;
                case "Wed":
                    day = "Wednesday";
                    break;
                case "Thu":
                    day = "Thursday";
                    break;
                case "Fri":
                    day = "Friday";
                    break;
                default:
                    day = "Saturday";
                    break;
            }
            alert(day);
          }
          else{
            alert(myDate + ' is not a valid date'); //If input is -1
          }
      });
      
    }
    
    var input = ['10/11/2009', '11/10/2010', -1];
    checkArray(input);
    &#13;
    &#13;
    &#13;

答案 4 :(得分:0)

强烈建议使用Date构造函数解析字符串,因为它在很大程度上取决于实现并且不可靠。 “10/11/2009”格式含糊不清,有些是十月十一日,大多数是11月10日。我猜你的意思是10月11日,那是星期天。

因此,您永远不应该使用Date构造函数(或Date.parse,它们与解析相同)来解析字符串,这是一个解析m / d / y格式并验证结果的简单函数:

function parseMDY(s) {
  var b = s.split(/\D/);
  var d = new Date(b[2], --b[0], b[1]);
  return d && d.getMonth() == b[0]? d || new Date(NaN);
}

date.toString()的结果完全取决于实现,没有什么可以确保前三个字符是日名,所以:

date.toDateString().slice(0,3)

可能会返回任何内容。更简单的是使用内置的 getDay 方法。如果必须使用switch语句,则:

switch (date.getDay())
  case 0:
    day = "Sunday";
    break;
  case 1:
    day = "Monday";
    break;
  ...

var days = ['Sunday','Monday','Tuesday','Wednesday',
            'Thursday','Friday','Saturday'];
var day = days[date.getDay()];

输入要少得多。