Este foro ya no está activo, así que no puedes publicar nuevas preguntas ni responder a las preguntas existentes.

Cómo obtener el elemento con mayor valor en un array asociativo de JavaScript

10 de abril de 2015

Hola, estoy haciendo una web y quiero mostrar un anuncio de acuerdo a sus visitas en ella. Me explico: si el usuario navega y da con la página del producto de fibra óptica "fibra", se ejecuta este script, añade un valor en localStorage, para ser exactos el siguiente:

fibra = localStorage.getItem("c_fibra");
// get a numeric value from str_count, put it in count
if (fibra == null || fibra == "null") {
  count = 0;
} else {
  count = parseInt(fibra);
}
 
// increment count
count++;
 
// display count
 
// store count
localStorage.setItem("c_fibra", count);

Con esto vendría siendo un contador de visitas para esa página. Así sucesivamente en otros productos, (fibra óptica, cables, alambres etc..) cada uno con su respectivo local storage y su contador.

Luego en su página de bienvenida quiero que de acuerdo a sus visitas, se muestre determinado anuncio, y que muestre el que mayor número tenga. Si el cliente visitó muchas veces fibra, más veces que cables, se ejecute cierto código, que muestre anuncios y descuentos de fibra óptica.

Mi código es funcional hasta cierto paso me atoré:

  • cables= 5 visitas
  • fibra = 15 visitas
  • producto 3 = 11 visitas

Pensé que la solucion era guardar en un array esos valores y con una función saco el valor máximo de esos enteros. Anexo mi código:

aereo = parseInt(localStorage.getItem("c_aereo"));
fibra = parseInt(localStorage.getItem("c_fibra"));
cobre = parseInt(localStorage.getItem("c_cobre"));
// Recojo los valores que se hayan generado
 
// estructura if, funciona si quiero ejecutar publicidad de uno o de otro,
// pero si son 10 productos?
 
if (fibra > aereo) {
    alert("Fibra es mayor que aereo");
}
else {
    alert("Aereo es mayor que fibra");
}
 
// Pensé que la solución era guardar esos datos en un array y luego desplegar el
// valor máximo, pero me devuelve valor entero, y no sé a cual pudiera corresponder
var values = [fibra,aereo,cobre],
    max = 0;
 
for(var i=0,len=values.length;i<len;i++) {
    if(max < values[i]) {
        max = values[i];
    }
}
 
alert(max);

Saludos y muchas gracias a las personas que ayudan.


Respuestas

#1

Como tú mismo dices, la solución basada en la estructura if es muy poco eficiente, ya que no va a adaptarse bien cuando tengas 10 o más productos.

De nuevo tu mismo das la que parece la mejor solución: guardar los datos en un array asociativo y luego extraer el mayor valor. Para ello tendrías que usar un código como el siguiente para guardar la información:

var contadores = {
    'fibra': 0,
    'cobre': 0,
    '...': 0,
};
 
// ...
 
contadores['fibra'] += 1;

Y para obtener el elemento del array con un valor más grande, tendrías que usar código JavaScript, ya que creo que no hay ninguna función nativa que lo haga por ti:

var valorMasGrande = -1;
var elementoMasGrande = null;
 
for (var i in contadores) {
    if (contadores[i] > valorMasGrande) {
        valorMasGrande = contadores[i]
        elementoMasGrande = i;
    }
}

@javiereguiluz

10 abril 2015, 9:07
#2

Hola Javier, muchisimas gracias! me ha funcionado el código que me mostraste, soy muy, pero muy novato en javascript y no conocía los arrays asociativos.

Gracias por la ayuda de siempre que brindan esta página.

saludos

@resback

10 abril 2015, 18:57