Estoy tratando de encontrar la manera de hacer que el código funcione de la misma manera que se muestra en el código a continuación usando los otros métodos para las declaraciones if/else. Alguien me puede ayudar con eso? Tengo muchas más ciudades y claramente esto no va a escalar.
function getCityNameFromURL() { var curURL = "" + Request.ServerVariables("URL"); var returnCityName = ""; curURL = curURL.toLowerCase(); if (curURL.indexOf("/sgncp/") != -1 || curURL.indexOf("/mlgct/") != -1) returnCityName = "London"; if ( curURL.indexOf("/berlinplus/") != -1 || curURL.indexOf("/berlinadmin/") != -1 ) returnCityName = "Berlin"; else if ( curURL.indexOf("/tokyoplus/") != -1 || curURL.indexOf("/tokyoadmin/") != -1 ) returnCityName = "Tokyo"; else if ( curURL.indexOf("/parisplus/") != -1 || curURL.indexOf("/parisadmin/") != -1 ) returnCityName = "Paris"; return returnCityName; }¿Qué tal un código basado en una configuración más simple? Incluso podría mover la información del mapa de la ciudad a un recurso separado.
Esto permitiría actualizaciones más sencillas sin tener que escribir código adicional.
function getCityNameFromURL() { var curURL = "" + Request.ServerVariables("URL"); curURL = curURL.toLowerCase(); var cityMappings = [ { code: '/sgncp/', city: 'London' }, { code: '/mlgct/', city: 'London' }, { code: '/berlinplus/', city: 'Berlin' }, { code: '/berlinadmin/', city: 'Berlin' }, { code: '/tokyoplus/', city: 'Tokyo' }, { code: '/tokyoadmin/', city: 'Tokyo' }, { code: '/parisplus/', city: 'Paris' }, { code: '/parisadmin/', city: 'Paris' } ]; return cityMappings .find(mapping => curURL.indexOf(mapping.code) >= 0) ?.city ?? ''; } Tenga en cuenta también, el condicional nulo ?. al intentar acceder a la propiedad de la city en caso de que la URL no coincida con ninguna de ellas y devuelva una cadena vacía.
Versión con bucle for
Reemplace el código cityMappings.find con este
for (let i = 0; i < cityMappings.length; i++){ const mapping = cityMappings[i]; if (curURL.indexOf(mapping.code) >= 0) return mapping.city; } // in case no match was found return an emtpy string. return '';Esta respuesta es muy similar a la ya dada por phuzi .
Esta respuesta también presenta un mapeo de la ciudad, pero de una manera algo diferente para reducir la duplicación de cadenas. También introduje una variable defaultCity para (posiblemente) mejorar la legibilidad del código.
function getCityNameFromURL() { const curURL = ("" + Request.ServerVariables("URL")).toLowerCase(); const defaultCity = { name: "" }; const cities = [ { name: "London", patterns: ["/sgncp/", "/mlgct/" ] }, { name: "Berlin", patterns: ["/berlinplus/", "/berlinadmin/"] }, { name: "Tokyo", patterns: ["/tokyoplus/", "/tokyoadmin/" ] }, { name: "Paris", patterns: ["/parisplus/", "/parisadmin/" ] }, ]; const city = cities.find(({ patterns }) => ( patterns.some(pattern => curURL.includes(pattern)) )) || defaultCity; return city.name; }O si prefieres un bucle for:
for (const { name, patterns } of cities) { for (const pattern of patterns) { if (curURL.includes(pattern)) return name; } } return "";