2016-10-13 1 views
0

Ich bin in den Zustand (Wert) von getcondition (req, Sequelize)Wie schreibe ich diesen Code besten Weg, der hat so viele wenn Bedingungen in Javascript?

Code erhalten:

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




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

so für unterschiedliche Anforderungen .i anderen Wert in options.where = getcondition (erf zuweisen haben , Sequelize);

also wie kann ich in einer effektiven Weise für getcondition schreiben (req, Sequelize);

meine getcondition (req, Sequelize) Funktionscode:

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") && 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") && !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") && !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") && 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") && !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" && !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 
     } 
    } 
} 
+0

Bitte ein MCVE, SO ist kein Debugging-Service – DrakaSAN

Antwort

0

ich so versucht, aber ich will mehr weniger und guten Code, plase

Funktion getcondition1 (erf einigen anderen Korrekturen geben, 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") && 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") && !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") && !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; 
     } 
1

Es sind genial JavaScript switch Statements. Benutze sie, wenn du so schreckliche Bedingungen hast.

UPD: Beispiel für die Verwendung 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')): { 
     // ... 
    } 
    } 
} 

Beachten Sie, dass der Schalter-Fall beim ersten Auftreten von jeder wahren Aussage brechen. Seien Sie also vorsichtig bei der Verwendung der Anweisungen break und return.

+0

werden Sie bitte einen Hinweis basierend auf diesen Bedingungen geben, wie Switch-Anweisung schreiben –

+0

@SimhaChalam, ja, ich habe ein einfaches Beispiel hinzugefügt. – denysdovhan

1

Die Verwendung von Schalteranweisungen könnte tatsächlich helfen, aber in Ihrem Fall sind die meisten Bedingungen zu kompliziert. Für die Syntax folgen Sie diesem Link: W3Schools javascript switch

Was Sie in Bezug auf gute Praktiken tun könnten, würde Sub_Functions erstellen, die in jeder Bedingung aufgerufen werden. Sie können auch einige Aufgaben in Ihren Unterfunktionen sammeln und if-Anweisungen hinzufügen. Dies wird Ihre Funktion erleichtern. Im Hinblick auf gute Praktiken sollten Ihre Unterfunktionen jedoch nicht redundant sein, versuchen Sie und wählen Sie sorgfältig, so dass jede Funktion, die Sie schreiben, einen anderen Zweck als die anderen hat.

EDIT: Ich sagte zuvor, dass Ihre Funktion nur eine Return-Anweisung haben sollte. Dies ist nicht ganz richtig, da diese Konvention den Code manchmal weniger leicht verständlich machen kann. Davon abgesehen ist es eine Frage des persönlichen Geschmacks. Ein guter Kompromiss wäre, eine Rückgabeanweisung am Anfang der Funktion für Fehlerfälle zu setzen und am Ende eine andere Rückgabeanweisung für die klassische Ergebnisrückgabe zu verwenden.

Sie können auch Mustervergleich verwenden. Siehe diesen Link: Pattern matching with javascript.

1

Split in Funktion und Lagerbedingungen und Funktionszeigern in einem Array

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 &= 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); 
} 
Verwandte Themen