заменить Eval на что-то более безопасное - PullRequest
0 голосов
/ 27 февраля 2020

Я создал календарь с библиотекой flatpickr. js. Я хочу включить только даты, которые присутствуют в массивах dateCorfu, dateZante и datePag, выбранных из раскрывающегося списка (с атрибутом name = "destinazione").

Я не кодер, но я написал приведенный ниже код, используя метод eval, это работает, но я уверен, что это неправильный путь .. может быть, есть лучший способ манипулировать результатом функции (дата). Так есть ли способ заставить это работать без использования eval?

flatpickr("#data-partenza", {
    locale:'it', 
    minDate: "2020-07-16",
    enable: [
        function(date) {
            // return true to enable
            var drop_destinazione = jQuery('[name="destinazione"]').val();
            var result = '';
            var dateCorfu = ["2020-07-16","2020-07-23","2020-07-30","2020-08-06","2020-08-13","2020-08-20"];
            var dateZante = ["2020-07-17","2020-07-24","2020-07-31","2020-08-07","2020-08-14"];
            var datePag = ["2020-07-18","2020-07-25","2020-08-01","2020-08-08"];
            var slice = 'date.toISOString().slice(0,10)';
            var i;
            if(drop_destinazione == 'Corfù'){
                for (i = 0; i < dateCorfu.length; i++) {
                    result += (slice + '==' + '"' + dateCorfu[i] + '"' + '||');
                }
                return eval(result.slice(0, -2));
            }
            else if(drop_destinazione == 'Zante'){
                for (i = 0; i < dateZante.length; i++) {
                    result += (slice + '==' + '"' + dateZante[i] + '"' + '||');
                }
                return eval(result.slice(0, -2));
            }
            else if(drop_destinazione == 'Pag'){
                for (i = 0; i < datePag.length; i++) {
                    result += (slice + '==' + '"' + datePag[i] + '"' + '||');
                }
                return eval(result.slice(0, -2));
            }
            else {
                console.log('no destination selected')
            }
        }
    ],
    dateFormat: "d-m-Y",
    disableMobile: true,
});

1 Ответ

1 голос
/ 27 февраля 2020

, поскольку вы выполняете только if-проверки, почему бы вам не сразу оценить и накопить при каждом результате + = ..?

result = false;
for (...) {
    if (condition) result = true;
}
return result;

или даже лучше: ранний выход следующим образом:

result = true;
for (...) {
    if (condition) return true;
}
return false;

, примененный к исходному коду, это сделает вашу функцию похожей на это:

function(date) {
    var drop_destinazione = jQuery('[name="destinazione"]').val();
    var dateCorfu = ["2020-07-16","2020-07-23","2020-07-30",
                     "2020-08-06","2020-08-13","2020-08-20"];
    var dateZante = ["2020-07-17","2020-07-24","2020-07-31",
                     "2020-08-07","2020-08-14"];
    var datePag = ["2020-07-18","2020-07-25","2020-08-01","2020-08-08"];
    var slice = date.toISOString().slice(0, 10);
    if (drop_destinazione == 'Corfù') {
        for (var i = 0; i < dateCorfu.length; i++) {
            if (slice == dateCorfu[i]) return true;
        }
    }
    else if(drop_destinazione == 'Zante') {
        for (var i = 0; i < dateZante.length; i++) {
            if (slice == dateZante[i]) return true;
        }
    }
    else if(drop_destinazione == 'Pag') {
        for (var i = 0; i < datePag.length; i++) {
            if (slice == datePag[i]) return true;
        }
    }
    else { console.log('no destination selected'); }
    return false;
}

однако есть шаги, которые вы можете предпринять, чтобы Код менее повторяющийся:

function(date) {
    var drop_destinazione = jQuery('[name="destinazione"]').val();
    var slice = date.toISOString().slice(0, 10);
    var allowed = {
        Corfù: ["2020-07-16","2020-07-23","2020-07-30",
                "2020-08-06","2020-08-13","2020-08-20"],
        Zante: ["2020-07-17","2020-07-24","2020-07-31",
                "2020-08-07","2020-08-14"],
        Pag: ["2020-07-18","2020-07-25","2020-08-01",
              "2020-08-08"],
    };
    if (allowed[drop_destinazione] == undefined) {
        console.log('no destination selected');
        return false;
    }
    return allowed[drop_destinazione].indexOf(slice) !== -1;
}

Конечно, имя свойства "Corfù" выглядит не слишком красиво, однако "drop_destinazione" кажется выпадающим списком, они имеют значение и метку (см. https://developer.mozilla.org/en-US/docs/Web/HTML/Element/select). вы должны сделать значения простыми строками, такими как "corfu":

<select>
    <option value="corfu">Corfù</option>
    ...
</select>

если вы сделаете это так, вы можете сделать разрешенный индекс более приятным:

var allowed = {
    corfu: ["2020-07-16","2020-07-23","2020-07-30",
            "2020-08-06","2020-08-13","2020-08-20"],
    zante: ["2020-07-17","2020-07-24","2020-07-31",
            "2020-08-07","2020-08-14"],
    pag: ["2020-07-18","2020-07-25","2020-08-01",
          "2020-08-08"],
};

надеюсь, это поможет!

...