if(weekly_trending === "true" && monthly_trending === "true" && quarterly_trending === "true" && sort_by_likes === "true" && sort_by_date === "true" ){ return } Estos son los filtros que quiero usar en mi API, pero quiero permitir usar solo uno de estos filtros a la vez, como weekly_trending === "true" , no cualquier otro de la lista.
Puedo hacerlo usando sentencias if como esta, pero tengo que escribir mucho código. ¿Hay alguna otra solución a esto?
algo que puede hacer es crear una matriz a partir de todos sus booleanos y con array.filter obtener una matriz de todos iguales a verdadero
var conditions = [ weekly_trending, monthly_trending, quarterly_trending, sort_by_likes, sort_by_date ]; conditions.filter(condition => condition)array.filter es un método que:
su if se puede simplificar a
if(conditions.filter(condition => condition).length === 1){ var weekly_trending = true; var monthly_trending = false; var quarterly_trending = false; var sort_by_likes = false; var sort_by_date = false; function getConditions() { return [ weekly_trending, monthly_trending, quarterly_trending, sort_by_likes, sort_by_date ]; } function validate() { var conditions = getConditions(); if(conditions.filter(condition => condition).length === 1) { console.log('win'); } else { console.log('failed'); } } validate(); monthly_trending = true; validate();Creo que esta solución funcionará si desea limitar solo un filtro para su API:
const filterWeeklyTrending = (unfilteredResults) => {/*...*/} // rest of the possible filter functions... const filterFunctions = { weekly_trending: filterWeeklyTrending, monthly_trending: filterMonthlyTrending, // rest of the possible filters... } // Suppose you are using Express and queries live in `req.param` like so: // { weekly_trending: 1 } // We want to return an array of matched filter names here. const matchedFilterNames = Object.keys(filterFunctions).filter(key => key in req.param) // eg ['weekly_trending'] if (matchedFilterNames.length !== 1) { // tell client they must provide only 1 filter return } // otherwise, filter results const selectedFilterFunction = filterFunctions[matchedFilterNames[0]] const filteredResults = selectedFilterFunction(unfilteredResults)Sin embargo, si está creando una API y el usuario final especifica el filtro, ¿un diseño ligeramente diferente que obligue al usuario final a elegir solo un filtro desde el principio mitigaría el problema?
por ejemplo, si es una API HTTP, sería mejor para el usuario proporcionar solo una opción de filtro si en lugar de http://my.site/api/sports?weekly_trending=true , tenemos http://my.site/api/sports?sort=weekly_trending ?
Entonces podemos sustituir lo siguiente:
const matchedFilterNames = Object.keys(filterFunctions).filter(key => key in req.param) // eg ['weekly_trending'] if (matchedFilterNames.length !== 1) { // tell client they must provide only 1 filter return }con
const filterName = req.params.sort // if this is where user specifies the filter function if (!(filterName in filterFunctions)) { // tell client this filter does not exist return }Cree un validador de clase auxiliar para agregar sus reglas según lo necesite y validar el resultado.
const weekly_trending = true; const monthly_trending = true; const quarterly_trending = true; const sort_by_likes = true; const sort_by_date = true; class Validator { constructor() { this.rules = []; } addRules(...rules) { this.rules.push(...rules); } validate() { if (this.rules.every(rule => rule === true)) { console.log("all true"); } } } const validator = new Validator(); validator.addRules( weekly_trending, monthly_trending, quarterly_trending, sort_by_likes, sort_by_date ); validator.validate();