我已经看过其他问题了,我已经尝试了过滤功能,但我不确定我是否正确使用它。
基本上我有一个对象数组,如下所示:
[{"hour":"6 am", "date":"2012-12-01"},{"hour":"7 am", "date":"2012-12-01"}]
我正在循环一段时间,每天我都会在早上6点到晚上9点之间徘徊。如果上述数组中存在小时(如该特定日期的小时)。我想将它标记为可用于新对象,然后传递给新数组。以下是我目前正在使用的代码。
for(var i = 0; i < dayCount; i++){//Loop through the days that exist in the schedule
day = new Object();
day.date = Date.parse(startDate).add(i).days();
day.dayName = weekday[day.date.getDay()]
day.hours = new Array();
for(var j = 6; j < 22; j++){ //Loop through hours of the day seeing if they're available/scheduled, etc.
if(j<=12){
thisHour = j +' am';
} else{
thisHour = j-12 + ' pm';
}
var thisIsAvailable = $(assignedHours).filter(function(){
return assignedHours.hour == thisHour && assignedHours.date == day.date.toString("yyyy-MM-dd");
});
var thisIsScheduled = 0;
day.hours.push({hour: thisHour,available: thisIsAvailable, scheduled: thisIsScheduled});
}
daysInSchedule.push(day);
}
几个笔记。我在day.date属性上使用.toString(),因为它是以JS Date格式格式化的,而我与之比较的值是MYSQL Date格式。我已经警告过(谈论旧学校调试)thisIsAvailable.length,我每次都得到0。任何想法都表示赞赏。谢谢!
编辑:刚刚意识到我忘了告诉你所有非常重要的事情。我给你的数组包含在变量Named assignedHours中。很抱歉离开了。编辑2:为了澄清,我的问题是在两个代码摘录之间的位置。我试图看看给定数组中的一个对象是否匹配循环中的日期和小时,以及我正在运行的嵌套循环。如果确实如此,我想将其传递给一个新对象,然后我将其推入当天的小时数组中。如果没有,那么我仍然传递对象,但是值为0,因为它可用。
答案 0 :(得分:3)
我怀疑你的问题在于你使用jQuery filter
方法的方式:
var thisIsAvailable = $(assignedHours).filter(function(){
return assignedHours.hour == thisHour && assignedHours.date == day.date.toString("yyyy-MM-dd");
});
如果我没弄错的话,assignedHours.hour
将始终未定义,因为它始终引用您的assignedHours
数组(您希望它引用您正在过滤的当前元素,即元素< em> inside assignedHours
)。
你可能想要做这样的事情:
var thisIsAvailable = $(assignedHours).filter(function(array_key){
return this.hour == thisHour && this.date == day.date.toString("yyyy-MM-dd");
});
Edit1:正如@Kevin B所指出的,$.grep
更适合过滤数组,因为它不会在数组周围创建DOM包装器:
$.grep(assignedHours, function(el) {
return el.hour == thisHour && el.date == day.date.toString("yyyy-MM-dd");
});
答案 1 :(得分:2)
根据OP的要求将评论提升为答案:
您应该在过滤器功能中检查
this.hour
和this.date
。