【问题标题】:javascript passing a function that loops through array to a function that uses switch statement date methodjavascript将遍历数组的函数传递给使用switch语句日期方法的函数
【发布时间】:2016-03-17 18:02:08
【问题描述】:

我正在尝试创建一个循环遍历数组并返回结果的函数。我试图将此函数传递给另一个函数,该函数使用 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

【问题讨论】:

  • 考虑到您发布的代码,myDate() 应该返回什么?
  • 您的return 在循环内。将始终在第 1 次迭代期间返回。
  • @leo.fcx myDate() 应该在数组中返回样本输入,所以当我将它传递给 findDate() 时,它会通过 switch 语句检查每个值
  • 没有意义,如果返回相同的数组,为什么要迭代?
  • @leo.fcx 一个函数的目的是保存数组中的值并返回这些值以用于另一个确定星期几的函数。如果您有任何解决方案,请随时提出建议,即使它不完全符合此标准

标签: javascript arrays function date switch-statement


【解决方案1】:

如果 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);

然后您只需稍微修改 findDay 以便它适用于您提供的每个日期字符串。这是一个示例,如果这是您的想法:

https://jsfiddle.net/2mnxcpwt/

【讨论】:

  • 谢谢你这解决了我的问题,我需要传入一个回调函数,并从你的 jsfiddle 中注意到轻微的调整!,你可以在你的答案中发布你的完整代码而不是链接到小提琴吗?将来给其他人?
  • 我意识到在这个解决方案中你将 findDay 传递给 myDate, myDate(findDay);事实上我需要将 myDate 传递给 findDay.....findDay(myDate)
  • findDay(myDate) 调用被认为是解决方案。我认为 myDate 应该是一个遍历分配数组的函数,当传递给 findDay 时,它将遍历 switch 语句中的那些返回值。
  • 我不确定我是否完全理解 myDate 应该做什么——它只是为了返回一个 Date 字符串数组吗?如果是这样,你不能只运行 findDay(myDate()),然后编写 find day 循环遍历数组吗?
  • 是的,没错,现在有解决方案,但如果您想更新您的解决方案,我会将其标记为正确
【解决方案2】:

你的逻辑不清楚。通常你有一个回调函数和数组的一些迭代器,它为每个元素调用回调。比如这样:

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>');

【讨论】:

  • 这就是我所缺少的,一个回调,我喜欢你的回答,解决这个问题的另一种方式,但我需要使用 switch 语句:(
  • 我投了赞成票,因为有另一种方法来解决这个问题,尽管它不太符合我解决这个问题的标准
【解决方案3】:

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

除了上述问题,我将任务打包到一个函数中:

function findmyDate ( input ) {
    input.forEach( function (myDate,k) {

    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
    }

  });
};

findmyDate( ['10/11/2009', '11/10/2010', '-1'] );

https://jsfiddle.net/nrp24x0w/测试函数

【讨论】:

  • 我投了赞成票,因为有另一种方法来解决这个问题,尽管它不太符合我解决这个问题的标准
  • 好奇为什么你在不使用的时候传入了额外的参数k?
【解决方案4】:

首先,你的数组是:

 ['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 变量正在使用最新的循环迭代值重新初始化。

你应该有:

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;

现在,您说“我正在尝试创建一个循环遍历数组并返回结果的函数。”但是,您还没有说应该如何打包这些结果。你想要什么?分隔列表?另一个数组?您是否考虑过:

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

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

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);

【讨论】:

  • 结果应该能够传递给 findDate 函数,其中 switch 语句将遍历每个返回的结果,记录日期或如果它不是日期
  • 感谢您澄清您提到的两个问题,但您的其余评论并未解决问题
  • 欢迎您。如果这有任何帮助,请随时投票。
  • 我投了赞成票,因为有另一种方法来解决这个问题,尽管它不太符合我解决这个问题的标准
  • 感谢斯科特,不仅仅是一个答案,而是一个解释,这就像给一个人一条鱼吃一天,而不是教他学习如何捕鱼并吃一辈子:)
【解决方案5】:

强烈建议不要使用 Date 构造函数解析字符串,因为它在很大程度上依赖于实现且不可靠。 “2009 年 10 月 11 日”的格式不明确,有些是 10 月 11 日,大多数是 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()];

打字少了很多。

【讨论】:

  • 你有没有机会把你提到的所有东西都结合到一个工作示例中?我基本上需要使用 switch 语句将数组传递给 findDay() 。我认为让 myDate() 函数遍历数组并将这些值作为参数传递给 findDay(myDate) 将是解决方案,但也许不是。我需要解决的问题只是说明了预期的示例输入和输出
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-10-02
  • 2020-09-16
  • 1970-01-01
  • 1970-01-01
  • 2014-05-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多