Могу ли я волшебным образом сделать селекторы нефункциональными, если значение выбора пустое?

#javascript #selector

#javascript #селектор

Вопрос:

Справочная информация: У меня есть функция, которую я вызываю следующим образом:

 hide_modules('string1','string2');
  

Функция выглядит примерно так:

 function hide_modules(param1,param2) {
       MM.getModules()
         .withClass(param1)
         .exceptWithClass(param2)
         .enumerate(function(module) {
           module.hide(
             // some other code
           );
         });
}
  

Большую часть времени я вызываю функцию со значениями, как показано выше.
Иногда я не хочу, чтобы ‘string1’ имел значение, и я бы хотел, чтобы моя функция не использовала этот первый селектор, эффективно вот так:

    MM.getModules()
     // .withClass(param1)
     .exceptWithClass(param2)
     .enumerate(function(module) {
       module.hide(
         // some other code
       );
     });
  

Я пытался просто вызвать его с пустой строкой, 0, false как param1, но выбор класса конечного результата — это не то, что я хочу.
Иногда я также вызываю это с пустым параметром param2 и не хочу, чтобы также использовался связанный с param2 селектор.

Итак, вопрос в следующем: без написания большого оператора if-then-else, есть ли какой-нибудь необычный способ, которым я могу сделать эти селекторы нефункциональными (эквивалент закомментирования, как указано выше), когда значения param1 и / или param2 не указаны?


Вспомогательный код, который вызывает моя функция, предоставлен для меня в сторонней библиотеке, которую я не могу изменить. Я включаю некоторые из соответствующих частей здесь, поскольку это может помочь с ответом:

 var withClass = function (className) {
    return modulesByClass(className, true);
};
var modulesByClass = function (className, include) {
    var searchClasses = className;
    if (typeof className === "string") {
        searchClasses = className.split(" ");
    }

    var newModules = modules.filter(function (module) {
        var classes = module.data.classes.toLowerCase().split(" ");

        for (var c in searchClasses) {
            var searchClass = searchClasses[c];
            if (classes.indexOf(searchClass.toLowerCase()) !== -1) {
                return include;
            }
        }

        return !include;
    });
  

Ответ №1:

Поскольку js не поддерживает перегрузку функций, единственный способ — проверить ваши параметры внутри вашего метода. Проверьте truthy , и тернарный оператор сделает свое дело

       var modules = MM.getModules();
      modules = param1 ? modules.withClass(param1) : modules;
      modules = param2 ? modules.exceptWithClass(param2) : modules;
      modules.enumerate(function(module) {
      module.hide(
         // some other code
       );
     });
  

чтобы пропустить первый параметр

 hide_modules(null,'string2');
  

чтобы пропустить второй параметр

 hide_modules('string1');
  

Комментарии:

1. Хорошо, я думаю, что я реализовал то, что вы предложили, но теперь я получаю сообщение об ошибке. Вот теперь моя полная функция: function(hideClasses,exceptClasses) { var modules=MM.getModules(); modules = hideClasses amp;amp; modules.withClass(hideClasses); modules = exceptClasses amp;amp; modules.exceptWithClass(exceptClasses); modules.enumerate(function(module) { module.hide( // some code ); }); },

2. MMM-Face-Reco-DNN.js: 240 не найдено (в обещании) Ошибка типа: не удается прочитать свойство ‘exceptWithClass’, равное нулю в Class.hide_modules (MMM-Face-Reco-DNN.js:240) в Class.notificationReceived (MMM-Face-Reco-DNN.js:371) при отправке уведомления (main.js: 96) в main.js:64

3. Извините за форматирование. Кажется, я не могу понять это правильно, но строка 240 modules = exceptClasses amp;amp; modules.exceptWithClass(exceptClasses); , и я вызываю функцию, подобную: hide_modules(null,this.config.classes_noface)