как наилучшим образом написать этот код, в котором так много условий if в javascript?

#javascript #node.js #express #sequelize.js

#javascript #node.js #выразить #sequelize.js

Вопрос:

Я получаю условие where(значение) из getcondition(req, Sequelize)

код:

   options.where = getcondition(req, Sequelize);
       options.include = [{
                model: hp_builders,
                required: true
            }, { ....  },{ .... }]




 hp_property.findAndCountAll(options, {
            subQuery: false
        }).then(function(result) {
res.json(result);
});
  

итак, для разных запросов. я должен присвоить разное значение в параметрах.где = getcondition(req, Sequelize);

итак, как я могу написать эффективным образом для getcondition(req, Sequelize);

мой код функции getcondition(req, Sequelize):

 function getcondition(req, Sequelize) {
    var condition = JSON.parse(req.query.selector);
    if (condition.hasOwnProperty("city_id")) {
        if (condition.hasOwnProperty("Inhibition")){
            console.log(JSON.stringify(condition));
            return {
                $and: [{
                        hp_city_id: condition.city_id
                    },
                    Sequelize.literal("`hp_property`.`hp_property_inhibition_status_id` IN ("   condition.Inhibition   ")"),
                ]
            }
        }
        if (condition.hasOwnProperty("bedrooms") amp;amp; condition.hasOwnProperty("budgetPrice")) {
            var budgetPrice = condition.budgetPrice.split(",");
            var minRange = budgetPrice[0];
            var maxRange = budgetPrice[1];
            return {
                $and: [{
                        hp_city_id: condition.city_id
                    },
                    Sequelize.literal("`hp_unit_details`.`hp_unit_type_id` IN ("   condition.bedrooms   ")"),
                    Sequelize.literal("`hp_unit_details.hp_unit_prices`.`price_per_sqft` * `hp_unit_details`.`property_size`  BETWEEN "   minRange   " AND "   maxRange)
                ]
            }
        }
        if (condition.hasOwnProperty("bedrooms") amp;amp; !condition.hasOwnProperty("budgetPrice")) {
            return {
                $and: [{
                        hp_city_id: condition.city_id
                    },
                    Sequelize.literal("`hp_unit_details`.`hp_unit_type_id` IN ("   condition.bedrooms   ")")
                ]
            }
        } else if (condition.hasOwnProperty("budgetPrice") amp;amp; !condition.hasOwnProperty("bedrooms")) {
            var budgetPrice = condition.budgetPrice.split(",");
            var minRange = budgetPrice[0];
            var maxRange = budgetPrice[1];
            return {
                $and: [{
                        hp_city_id: condition.city_id
                    },
                    Sequelize.literal("`hp_unit_details.hp_unit_prices`.`price_per_sqft` * `hp_unit_details`.`property_size`  BETWEEN "   minRange   " AND "   maxRange)
                ]
            }
        }
        return {
                hp_city_id: condition.city_id
        }
    }
    else if (condition.hasOwnProperty("id")) {
        if (condition.hasOwnProperty("Inhibition")){
            console.log(JSON.stringify(condition));
            return {
                $and: [{
                        hp_builders_id: condition.id
                    },
                    Sequelize.literal("`hp_property`.`hp_property_inhibition_status_id` IN ("   condition.Inhibition   ")"),
                ]
            }
        }
        if (condition.hasOwnProperty("bedrooms") amp;amp; condition.hasOwnProperty("budgetPrice")) {
            var budgetPrice = condition.budgetPrice.split(",");
            var minRange = budgetPrice[0];
            var maxRange = budgetPrice[1];
            return {
                $and: [{
                        hp_builders_id: condition.id
                    },
                    Sequelize.literal("`hp_unit_details`.`hp_unit_type_id` IN ("   condition.bedrooms   ")"),
                    Sequelize.literal("`hp_unit_details.hp_unit_prices`.`price_per_sqft` * `hp_unit_details`.`property_size`  BETWEEN "   minRange   " AND "   maxRange)
                ]
            }
        }
        if (condition.hasOwnProperty("bedrooms") amp;amp; !condition.hasOwnProperty("budgetPrice")) {
            return {
                $and: [{
                        hp_builders_id: condition.id
                    },
                    Sequelize.literal("`hp_unit_details`.`hp_unit_type_id` IN ("   condition.bedrooms   ")")
                ]
            }
        } else if (condition.hasOwnProperty("budgetPrice" amp;amp; !condition.hasOwnProperty("bedrooms"))) {
            var budgetPrice = condition.budgetPrice.split(",");
            var minRange = budgetPrice[0];
            var maxRange = budgetPrice[1];
            return {
                $and: [{
                        hp_builders_id: condition.id
                    },
                    Sequelize.literal("`hp_unit_details.hp_unit_prices`.`price_per_sqft` * `hp_unit_details`.`property_size`  BETWEEN "   minRange   " AND "   maxRange)
                ]
            }
        }
        return {
            hp_builders_id: condition.id
        }
    } else if (condition.hasOwnProperty("location_id")) {
        console.log(JSON.stringify(req.query.selector)   ".....");
        return {
            hp_location_id: condition.location_id
        }
    }
}
  

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

1. Пожалуйста, отправьте MCVE, SO не является службой отладки

Ответ №1:

Разделить функцию и сохранить условия и указатель на функцию в массиве

 var conditions = [
  {
      keys: [
          {"key": "id", required:true}
          {"key": "price", required:false}
      ],
      function: fn1
  },
  {
      keys: [
            {"key": "id", required:false}
            {"key": "price", required:false}
      ],
      function: fn2
  }
];

function checkKey(obj, id, required)
{
    if(required)
      return obj.hasOwnProperty(id);
    else
      return !obj.hasOwnProperty(id);
}

function checkKeys(obj, keys)
{
   var condition = true;
   for(var i = 0; i < keys.length; i  )
   {
      condition amp;= checkKey(obj, keys[i].key, keys[i].required);
   }
   return condition;
}

for(var i = 0; i < conditions.length; i  )
{
   if(checkKeys(obj, conditions[i].keys))
      return conditions[i].function(obj);
}
  

Ответ №2:

Есть потрясающие инструкции JavaScript switch . Используйте их, когда у вас такие ужасные условия.

UPD: Пример использования switch :

 function getcondition(req, Sequelize) {
  const condition = JSON.parse(req.query.selector);

  switch (true) {
    case (condition.hasOwnProperty('city_id')): {
      // ...
    }
    case (condition.hasOwnProperty('id')): {
      // ...
    }
    case (condition.hasOwnProperty('location_id')): {
      // ...
    }
  }
}
  

Обратите внимание, что переключатель сломается при первом появлении любого истинного утверждения. Итак, будьте осторожны при использовании break return операторов and .

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

1. пожалуйста, дайте подсказку, основанную на этих условиях, как написать оператор switch

2. @SimhaChalam, да, я добавил простой пример.

Ответ №3:

Использование операторов switch действительно может помочь, но в вашем случае большинство условий слишком сложны. Для синтаксиса перейдите по этой ссылке: переключатель W3Schools javascript

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

РЕДАКТИРОВАТЬ: я ранее говорил, что ваша функция должна иметь только один оператор return . Это не совсем верно, поскольку это соглашение может иногда сделать код менее понятным. При этом это вопрос личного вкуса. Хорошим компромиссом было бы поместить оператор return в начале функции для случаев ошибок и использовать другой оператор return в конце для классического возврата результата.

Вы также можете использовать сопоставление с образцом. Смотрите эту ссылку: Сопоставление шаблонов с javascript.

Ответ №4:

я пробовал так, но я хочу больше, меньше и хорошего кода, пожалуйста, внесите некоторые другие исправления

функция getcondition1(req, Sequelize) {

 var condition = JSON.parse(req.query.selector);

if (condition.hasOwnProperty("city_id")) {
   return comparison(condition,"city_id","hp_city_id");
}

else if (condition.hasOwnProperty("id")) {
    return comparison(condition,"id","hp_builders_id");
}

else if (condition.hasOwnProperty("location_id")) {
    return comparison(condition,"location_id","hp_location_id");
}
  

}

 function comparison(condition,id,dbId){
        var obj={};
        var andCondition=[];
        var subCondition={};

        if (condition.hasOwnProperty("Inhibition")){
            subCondition[dbId]=condition.id;
            andCondition.push(subCondition,Sequelize.literal("`hp_property`.`hp_property_inhibition_status_id` IN ("   condition.Inhibition   ")"));

            obj['$and']=andCondition;

            return obj;

        }

        if (condition.hasOwnProperty("bedrooms") amp;amp; condition.hasOwnProperty("budgetPrice")) {
            var budgetPrice = condition.budgetPrice.split(",");
            var minRange = budgetPrice[0];
            var maxRange = budgetPrice[1];

            subCondition[dbId]=condition.id;
            andCondition.push(subCondition,Sequelize.literal("`hp_unit_details`.`hp_unit_type_id` IN ("   condition.bedrooms   ")"),Sequelize.literal("`hp_unit_details.hp_unit_prices`.`price_per_sqft` * `hp_unit_details`.`property_size`  BETWEEN "   minRange   " AND "   maxRange));

            obj['$and']=andCondition;

            return obj;
        }

        if (condition.hasOwnProperty("bedrooms") amp;amp; !condition.hasOwnProperty("budgetPrice")) {

            subCondition[dbId]=condition.id;
            andCondition.push(subCondition,Sequelize.literal("`hp_unit_details`.`hp_unit_type_id` IN ("   condition.bedrooms   ")"))
            obj['$and']=andCondition;

            return obj;

        } else if (condition.hasOwnProperty("budgetPrice") amp;amp; !condition.hasOwnProperty("bedrooms")) {
            var budgetPrice = condition.budgetPrice.split(",");
            var minRange = budgetPrice[0];
            var maxRange = budgetPrice[1];

             subCondition[dbId]=condition.id;
            andCondition.push(subCondition,Sequelize.literal("`hp_unit_details.hp_unit_prices`.`price_per_sqft` * `hp_unit_details`.`property_size`  BETWEEN "   minRange   " AND "   maxRange))
               obj['$and']=andCondition;

            return obj;

        }

           obj[dbId] =condition.id

        return  obj;
      }