如何测试Javascript数组中是否存在对象?

时间:2012-11-01 14:19:46

标签: javascript jquery json

我已经看过其他问题了,我已经尝试了过滤功能,但我不确定我是否正确使用它。

基本上我有一个对象数组,如下所示:

[{"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,因为它可用。

2 个答案:

答案 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.hourthis.date