Nueva pregunta

Pregunta:

Fecha: 07-01-2018 05:41:57 (En Español)

Javascript/php, condicionales en if()[Resuelta]

Mis saludos.

Estoy trabajando con Javascript/jQuery y con mis mapas, con un resultado "extraño" en el planteamiento del código:

Condicionales en if (viene de una conssulta JSON de archivos generados ) :
	  var tipo = res[i].tipo;
	  var causa = res[i].causa;// se trata de condiciones meteorológicas
 if (tipo == "Puertos de montaña" || tipo == "Vialidad invernal tramos"){
		if (causa == "Agua nieve" || causa == "Nevando" || causa == "Nieve") {
		  url = 'icon/nieve.png';
// se trata de código de cambios (iconos, presentacion de eventos en el mapa)
		}
	  };

Funciona bien.

En algunos casos la complejidad es mayor y pretendo reducir código:
if (tipo == ("Puertos de montaña" || "Vialidad invernal tramos")){
		if (causa == ("Agua nieve" || "Nevando"  !!"Nieve") {
		  url2 = 'icon/nieve.png';
		}
	  };

Me interpreta las condicionales al hazar (a capricho de Google o Firefox). No siempre pero es más susceptible al error cuando hay espacios en blanco como "Puertos de montaña" ó "Agua nieve" .

Pregunta: ¿Son correctas las dos planteaciones?
Si lo son, ¿por qué el resultado varía?
Si no lo son, ¿Cuál es el problema/ solución).


Sería fácil interpretar que haga lo que funcion al 100%.
Pero si se plantean cuestiones como (icono de marca de estaciones de servicio en el mapa):

if (data[i].Rótulo == ( 'BP' || 'BP VITORIA' || 'BP OIL ESPAÑA, S.A.' || 'BP BENIDORM' || 'BP OIL ESPAÑA, S.A.U.' || 'BP LOS PALACIOS' || 'BP. JACARILLA' || 'BP OIL ESPAÑA' || 'INUBEL - NOVELDA,BP' || 'BP. SAN BARTOLOME LA CAMPANETA' || 'BP. (CAPUCHINOS)' || 'BP. (EL LIMONAR)' || 'BP. LA APARECIDA DE ORIHUELA' || 'BP ROJALES' || 'BP RAMBLA INIESTA' || 'BP MONTSERRAT - ALMERIA' || 'BP LA COSTA-COOP STA Mª AGUILA' || 'BP-COOP STA Mª AGUILA-EL EJIDO, AL3303' || 'BP OIL ESPAÑA - ES.VIATOR' || 'BP VIAPARK' || 'BP SANCHA BRAVA' || 'LAS VAGUADAS S.A.L. (BP)' || 'BP ES FORTI' || 'BP PLAYA DE PALMA' || 'BP BADANOR' || 'BP MONTIGALA' || 'BP SANTIGA' || 'BP ALMOGAVARES' || 'BP PEDRO IV' || 'BP OIL' || 'BP PARADA LA CREU' || 'BP LA BOBILA' || 'BP GUALBA' || 'BP MONTGAT' || 'BP RECA' || 'BP SABADELL' || 'BP SAN BOI' || 'BP MONTSENY' || 'BP COLL FAVA' || 'BP JORDAN' || 'BP VILADECANS' || 'BP EL FRESNO' || 'BP LA MONTERA' || 'BP LA PEÑITA DE CADIZ' || 'BP EL FLORIN' || 'BP URBISUR' || 'BP LA BAHIA' || 'BP PUERTO STA. MARIA' || 'E.S. BP ROTA' || 'BP CALLE REAL' || 'BP OIL ESPAÑA- GUARROMAN' || 'BP OIL ESPAÑA- GUARROMAN' || 'BP OIL ESPAÑA S.A.' || 'BP OMEGA ESPINARDO' || 'BP LA PAZ' || 'BP AGAETE' || 'BP KM 13 CRUCE ARINAGA' || 'BP LAS VEGAS"' || 'BP CRUCE SANTIDAD-ARUCAS' || 'BP ARGUINEGUIN' || 'BP MOYA' || 'BP KM 13 - 1 (SAN ANDRES)' || 'BP KM 13 - 2 (SAN ANDRES)' || 'BP SAN LORENZO' || 'BP SAN JOSE' || 'BP PUERTO DE LA LUZ' || 'BP TERMINAL PUERTO' || 'BP CIDELMAR' || 'BP COOPERATIVA TAXIS S. CRISTOBAL' || 'BP LA PATERNA' || 'BP CIUDAD JARDIN' || 'BP TAMARACEITE II' || 'BP GUANARTEME' || 'BP ALTAVISTA' || 'BP MUELLE CHICO' || 'BP EL VERIL' || 'BP SANTA BRIGIDA' || 'BP SARDINA SUR' || 'BP EL TARO' || 'BP DOCTORAL' || 'BP GUIA' || 'BP JINAMAR' || 'BP LAS TERRAZAS' || 'BP LA GARITA' || 'BP EL CALERO' || 'BP TEROR' || 'BP VALLESECO' || 'BP SAN MATEO' || 'BP LA ATALAYA' || 'BP SAN SEBASTIAN' || 'BP SIAM MALL' || 'BP LA HIDALGA' || 'BP CABO BLANCO' || 'BP LAS AMERICAS' || 'BP TACO NORTE' || 'BP SAN BENITO' || 'BP CRUZ DEL SEÑOR' || 'BP AVENIDA 3 DE MAYO' || 'BP TACO' || 'BP E.S.BAELO' || 'BP ALJAROIL S.L.' || 'BP BENCIR(IKEA-CASTILLEJA)' || 'BP MONTEQUINTO' || 'BP EL ALAMO' || 'BP EL FONTANAL' || 'BP EL OLIVO' || 'E.S.ALCARAYON (BP OIL)' || '' || 'BP LA PALMERA' || 'BP SANTIPONCE' || 'BP SAN LAZARO' || 'BP LAS AMERICAS' || 'BP TACO NORTE' || 'BP SAN BENITO' || 'BP CRUZ DEL SE\u00d1OR' || 'BP AVENIDA 3 DE MAYO' || 'BP TACO' || 'BP E.S.BAELO' || 'BP ALJAROIL S.L.' || 'BP BENCIR(IKEA-CASTILLEJA)' || 'BP MONTEQUINTO' || 'BP EL FONTANAL' || 'E.S.ALCARAYON (BP OIL)' || 'BP CROSS' || 'BP SANTIPONCE' || 'BP SAN LAZARO' || 'BP PARQUE DE LOS PRINCIPES' || 'BP LA AURORA' || 'BP - REOCIN 9"' || 'BP VEGA JUNCAL' || 'BP VEGA JUNCAL' || 'E.S. BP CARY 1' || 'BP HOFIRA' || 'BP EL PUIG' || 'BP A3' || 'BP RIU TURIA' || 'BP ARNAU' || 'BP CAMPANAR' || 'E.S.BP LA DEHESA' || 'BP BENGOECHEA' || 'BP VITORIA')) {
	    url = 'icon/bp.png';
}


Ya no es un planteamiento por tiempo/trabajo sino por lógica en el código.
Si trasladamos las condicionales a PHP obtenemos el mismo resultado.

Saludos
Etiquetas: Javascript - Javascript JSON - JQuery - PHP - Pregunta Votos: 2 - Respuestas: 6 - Vistas: 13 Compartir en: Google Facebook Twitter LinkedIn Link
 

Respuestas:

  • Fecha: 07-01-2018 13:52:02 Hola Txema,
    Los dos planteamientos son diferentes:

    Veamos el primero:

    if (tipo == "Puertos de montaña" || tipo == "Vialidad invernal tramos"){
    


    Aquí significa: Si el contenido de la variable tipo es igual a Puertos de montaña o el contenido de la variable tipo es igual a Vialidad invernal tramos entonces haz lo que se encuentre en el condicional. Eso funciona bien

    Ahora veamos el segundo:

    if (tipo == ("Puertos de montaña" || "Vialidad invernal tramos")){
    


    Aquí significa algo totalmente diferente: Si el contenido de la variable tipo es igual a la operación OR entre dos cadenas de caracteres NO VACÍAS entonces haz lo que se encuentre en el condicional. Aquí es importante saber que al evaluar un OR entre dos cadenas de caracteres el resultado siempre es un boolean true, ergo terminas siempre con la siguiente comparación:


    if (tipo == true){
    


    Y aquí entra en juego cada navegador. La comparación la estás haciendo entre un string y un bool, por lo tanto algunos navegadores tratarán de convertir el boolean a string y otros tratarán de convertir el string a boolean con resultados aleatorios.

    Para lo que quieres hacer es mejor utilizar un framework que te ayude a buscar el valor dentro de un array de datos:


    Dojo Toolkit: dojo.indexOf(array, value, [fromIndex, findLast])
    Prototype: array.indexOf(value)
    MooTools: array.indexOf(value)
    MochiKit: findValue(array, value)
    MS Ajax: array.indexOf(value)
    Ext: Ext.Array.contains(array, value)
    Lodash: _.includes(array, value, [from]) (is _.contains prior 4.0.0)
    ECMAScript 2016: array.includes(value)
    jQuery: jQuery.inArray( value, array [, fromIndex ] )
      Votos: 3 - Link respuesta
     
  • Fecha: 07-01-2018 15:38:56 Gracias Ernesto.

    Entiendo lo que me dices. Claro está que, como string o boolean, creía que en ambos casos entraría el condicional.

    Como ves y después de que ello está dentro de un for (for (var i = 0; i < res.length; i++) { ... }) probaré mañana (luego) esto ya que estoy trabajando con JQuery
    var tipo = res[i].tipo;
    var causa = res[i].causa;
    var arraytipo = ["Puertos de montaña", "Vialidad invernal tramos"];
    if (jQuery.inArray(res[i].tipo, arraytipo) != -1) {
        var arraycausa = ["Agua nieve", "Nevando", "Nieve"];
        if (jQuery.inArray(res[i].causa, arraycausa) != -1) {
            url = 'icon/nieve.png';
        }
    }

    Veremos cómo se portan los navegadores. Y si no, (else{}) trabajaremos con lo que funciona.

    P.D. Estoy leyendo esto (¿Cómo puedo verificar si una matriz incluye un objeto en JavaScript?). Hay material para probar.

    Gracias.
      Votos: 1 - Link respuesta
     
  • Fecha: 07-01-2018 16:45:43 Resultado:

    Mi segundo planteamiento falla aleatoriamente como bien indicaba Ernesto.

    El nuevo código con jQuery.inArray () funciona perfectamente.

    Dejo el enlace a la documentación: jQuery.inArray ()

    Tema resuelto.

    Gracias nuevamente.
      Votos: 1 - Link respuesta
     
  • Fecha: 09-01-2018 17:50:37 Aunque lo q Estas haciendo se validar en tu if con texto no es buena práctica ya q en los caracteres pueden ven ñ tildes, etc caracteres especiales quizás en algunos navegadores te reconozca pero en otros no te recomiendo que validez con el código si nl con la descripción saludos att Jose quinto   Votos: 0 - Link respuesta
     
  • Fecha: 09-01-2018 21:41:04 Gracias Juan (o José) Quinto. Eso no representa problema alguno.

    Si analizamos el JSON más extenso que recojo de un excel (en torno a 20.000 registros con 22 datos cada registro) de entrada tengo apartados como "Dirección", que json_encode los filtroa mediante utf8_encode y lo lee como "Direcci\u00f3n". Unicode ya se preocupó de que podamos trabajar con todo tipo de caracteres y signos en cualquier idioma .

    También las coordenadas geográficas me llegan con comas pero es sencillo cambiarlas por puntos como me exige Google Maps

    Es más, el filtro me exige que recoja los datos con acentos o eñes ("ESPA\u00d1A" por ejemplo).

    Mayor problema lo tengo con un XML (menos extenso pero más complejo) en ISO 8859-1 que lo traslado a JSON mediante json_encode($simpleXml) donde me registra entre otros apartados, "Puertos de Monta\u00c3\u00b1a"

    Pero los datos son los que son y no puedo cambiar el diccionario español. No estoy teniendo problema alguno en ello.

    No puedo considerar que la Real Academia utilice malas prácticas y Álava, Ávila, Jaén o Castellón seguirán llevando acento.
      Votos: 0 - Link respuesta
     
  • Fecha: 10-01-2018 05:45:28 Hola tema quizás no se entendió mi respuesta a lo que yo me refiero es que por las buenas prácticas es recomendable validar por campo código, no por descripcion ya que los navegadores lo interpreta diferente uno de otro un ejemplo me paso cuando mandaba por url nombre de un archivo pdf en cual tenia espacio en blanco por ejemplo estado de cuenta cosa que en un navegador llegaba tal cual pero en otro estado%de%cuenta saludos   Votos: 0 - Link respuesta
     
Para participar activamente de la comunidad primero debes autenticarte, ingresa al sistema.Iniciar Sesión
 
frjcbbae garagebible.com