Javascript массив не работает ??смущенный - PullRequest
0 голосов
/ 03 июня 2011

Кто-нибудь знает, почему это не сработает более чем с 1 датой ...

требуется только первая дата в массиве ...

var unavailableDates = ["10-6-2011","13-6-2011"];

function unavailable(date) {
    dmy = date.getDate() + "-" + (date.getMonth() + 1) + "-" + date.getFullYear();
    if ($.inArray(dmy, unavailableDates) == 0) {
        return [false, "", "Unavailable"];
    } else {
        var day = date.getDay();
        return [(day != 0 && day != 2 && day != 3 && day != 4 && day != 6)];
    }
}

см. Полный пример ниже

http://offline.raileisure.com/lee.php

Заранее спасибо

Lee

Ответы [ 4 ]

8 голосов
/ 03 июня 2011

Это не работает, потому что вы неправильно интерпретируете возвращаемое значение $ .inArray (). Функция возвращает -1 , когда цель поиска не может быть найдена, и индекс в массиве, когда это возможно. Таким образом, когда он возвращает 0 , это означает, что нашел то, что искал код.

Милый трюк & mdash; для тех, кто любит милые трюки & mdash; для проверки возвращаемого значения из функций типа "$ .inArray ()" необходимо применить оператор "~":

if (~$.inArray(needle, haystack)) {
  // found it
}
else {
  // did not find it
}

Оператор "~" формирует побитовое дополнение (или "дополнение 1") своего аргумента. Поскольку «~ -1» равно 0, а «n» не равно нулю для любого другого целого числа, оно эффективно соответствующим образом преобразует возвращаемое значение в значение «истина / ложь». Не используйте его, если вам не нравятся милые трюки: -)

Кроме того, переменная "dmy", используемая в паре функций, должна быть объявлена ​​в каждой с ключевым словом var.

3 голосов
/ 03 июня 2011

jQuery.inArray возвращает индекс найденного элемента, т. Е. Когда он соответствует второму значению, он возвращает 1, а не 0, для которого вы проверяете.

Вы должны изменить свой тест на >= 0, а не == 0, когда вы делаете

if ($.inArray(dmy, unavailableDates) == 0) { ...
1 голос
/ 03 июня 2011

Это читается как мм-дд-гггг?

Если это так - тогда 13-6-2011 не будет действительной датой.

Редактировать Хорошо - смотрите на вашей странице; очевидно, что с 10 июня он недоступен, как ожидается.

Я удалил ответ, но когда дело касается дат, я думаю, что это ценная вещь, которую нужно запомнить (например, на клиенте из США, вероятно, я был бы прав?), Поэтому я удалил его.

Я избавлюсь от этого снова, хотя, если сообщество сочтет, что я должен.

0 голосов
/ 03 июня 2011

Попробуйте: в чистом javascript: я сделал несколько модификаций, чтобы сделать ваш код быстрее

function inArrayOrStr (o, v) {
    return ~o.indexOf(v);
}

unavailableDates = ["10-6-2011","13-6-2011"];

function unavailable(date) {
    var dmy = [date.getDate() ,(date.getMonth() + 1) , date.getFullYear()].join("-");
    if (inArrayOrStr(unavailableDates, dmy) {
        return [false, "", "Unavailable"];
    } else {
        var day = date.getDay();
        return [day > 7];
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...