我正在尝试创建一个循环遍历数组并返回结果的函数。我试图将此函数传递给另一个函数,该函数使用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
答案 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);
然后你只需要稍微修改findDay,以便它可以在你给它的每个日期字符串上工作。这是一个例子,如果这是你的想法:
答案 1 :(得分:1)
你的逻辑不清楚。通常你有一个函数,它是一个回调函数,也是一个为每个元素调用回调的数组的迭代器。例如:
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;
答案 2 :(得分:1)
我认为主要问题是,您检查了 await ScannedCode.AddAsync().ConfigureAwait(false);
是否在数组中为if (myDate !== -1) {
设置了myDate
的值。所以你想比较一个字符串和一个数字。
除上述问题外,我已将任务打包在一个函数中:
[..., '-1']
测试功能
答案 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;
}
这里有两个问题:
return
语句在循环中,导致循环终止
在第一次迭代时。
在循环内部,正在使用旧的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;
现在,你说&#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
由于您似乎只是想检查数组,因此不清楚为什么需要第二个数组或第二个函数,但这是一个完成主要工作的示例:
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;
答案 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()];
输入要少得多。