#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;
}