Foros del Web » Programando para Internet » Javascript »

Contar número de elementos repetidos en array

Estas en el tema de Contar número de elementos repetidos en array en el foro de Javascript en Foros del Web. Hola Pues eso mismo, quiero contar las veces que se repite un elemento en un array. Cuando solo se repite un elemento las veces que ...
  #1 (permalink)  
Antiguo 16/09/2009, 14:16
Avatar de Adler
Colaborador
 
Fecha de Ingreso: diciembre-2006
Mensajes: 4.671
Antigüedad: 17 años, 4 meses
Puntos: 126
Contar número de elementos repetidos en array

Hola

Pues eso mismo, quiero contar las veces que se repite un elemento en un array. Cuando solo se repite un elemento las veces que sea no tengo problemas, pero si dos o más elementos están duplicados, no logro sacarlos. Esto es lo que tengo hecho hasta ahora

Código javascript:
Ver original
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
  2. <html xmlns="http://www.w3.org/1999/xhtml">
  3. <head>
  4. <meta name="http-equiv" content="Content-type: text/html; charset=UTF-8"/>
  5. <script type="text/javascript">
  6. function EliminarRepetidos(valores) {
  7. var arr_origen = valores.split("");
  8. var arr_limpio = [];
  9. var val_eliminados = [];
  10. var no_repetidos = {};
  11. var repetidos = {};
  12. var cantidad = 0;
  13. var al_repeticiones = "";
  14.     for(var i = 0; i < arr_origen.length; i++){
  15.         if(!(arr_origen[i] in no_repetidos)) {
  16.             arr_limpio.push(arr_origen[i]);
  17.             no_repetidos[arr_origen[i]]++;
  18.         }else{
  19.             val_eliminados.push(arr_origen[i]);
  20.             repetidos[arr_origen[i]]++;
  21.         }
  22.     }
  23.  
  24.  
  25.  
  26.  
  27.     for(var i = 0; i < arr_origen.length; i++){
  28.         if(arr_origen[i] in repetidos) {
  29. var cuantos = cantidad ++;
  30. var cual = arr_origen[i];
  31.         } else {
  32.             al_repeticiones += arr_origen[i]+ " ------ Repetido 0 veces\n";
  33.         }
  34.     }
  35.     al_repeticiones += cual+ " ------ Repetido " + cuantos + " veces\n";        
  36.     alert(al_repeticiones)
  37.  
  38.  
  39.  
  40. //alert("Arreglo Original: " +arr_origen + "\nArreglo Limpio: " +arr_limpio + "\nValores Eliminados: " + val_eliminados)
  41. //return arr_limpio;
  42. }
  43. </script>
  44. </head>
  45. <body>
  46. <a href="javascript:void(0);" onclick="EliminarRepetidos('14234536734893');">Ver</a>
  47. </body>
  48. </html>

Gracias
__________________
Los formularios se envían/validan con un botón Submit
<input type="submit" value="Enviar" style="background-color:#0B5795; font:bold 10px verdana; color:#FFF;" />
  #2 (permalink)  
Antiguo 16/09/2009, 14:21
Avatar de zerokilled
Javascripter
 
Fecha de Ingreso: abril-2009
Ubicación: Isla del Encanto, La Borinqueña [+>==]
Mensajes: 8.050
Antigüedad: 15 años
Puntos: 1485
Respuesta: Contar número de elementos repetidos en array

hola Adler,
no he leido tu post completo pero verifica si este tema te ayuda http://www.forosdelweb.com/f13/agrup...-array-735614/
__________________
la maldad es una virtud humana,
y la espiritualidad es la lucha del hombre contra su maldad.
  #3 (permalink)  
Antiguo 16/09/2009, 16:00
Avatar de Adler
Colaborador
 
Fecha de Ingreso: diciembre-2006
Mensajes: 4.671
Antigüedad: 17 años, 4 meses
Puntos: 126
Respuesta: Contar número de elementos repetidos en array

Hola, Zerokilled

Bien he usado prototype para permitir adicionar propiedades al objetos, pero aún así no lo consigo. Mira ahora lo quedado así

Código javascript:
Ver original
  1. Array.prototype.EliminarRepetidos = function (valores) {
  2. //function EliminarRepetidos(valores) {
  3. var arr_origen = valores.split("");
  4. var arr_limpio = [];
  5. var val_eliminados = [];
  6. var no_repetidos = {};
  7. var repetidos = {};
  8. var cantidad = 0;
  9. var al_repeticiones = "";
  10.     for(var i = 0; i < arr_origen.length; i++){
  11.         if(!(arr_origen[i] in no_repetidos)) {
  12.             arr_limpio.push(arr_origen[i]);
  13.             no_repetidos[arr_origen[i]]++;
  14.         }else{
  15.             val_eliminados.push(arr_origen[i]);
  16.             repetidos[arr_origen[i]]++;
  17.         }
  18.  
  19.     }
  20.  
  21. alert(repetidos.length)

he usado todas la propiedades que se me han ocurrido pero o bien devuelve NaN o indefinido

Gracias
__________________
Los formularios se envían/validan con un botón Submit
<input type="submit" value="Enviar" style="background-color:#0B5795; font:bold 10px verdana; color:#FFF;" />
  #4 (permalink)  
Antiguo 16/09/2009, 17:03
Avatar de zerokilled
Javascripter
 
Fecha de Ingreso: abril-2009
Ubicación: Isla del Encanto, La Borinqueña [+>==]
Mensajes: 8.050
Antigüedad: 15 años
Puntos: 1485
Respuesta: Contar número de elementos repetidos en array

lei ambos codigos tuyo, y te da NaN por esta linea no_repetidos[arr_origen[i]]++;. estas sumando undefined + 1 el cual equivale a NaN. ahora bien, no comprendo si lo que quieres es contar la cantidad de elementos repetidos como lo dice el titulo o si quieres eliminar los elementos repetidos como dice la funcion.
  • contar elementos repetidos:
    Código:
    Array.prototype.count_value = function(){
    var count = {};
    for(var i = 0; i < this.length; i++){
    if(!(this[i] in count))count[this[i]] = 0;
    count[this[i]]++;
    }
    return count;
    }
    
    con count_value devuelve un objeto donde las propiedades son los elementos del array y el valor son las veces que se repite.
    Código:
    // un ejemplo;
    array = "abcdabcd".split('');
    obj = array.count_value();
    // obj es {a:2, b:2, c:2, d:2};
    
    si mas bien te interesa representarlo en un string, se me ocurre implementarle un metodo:
    Código:
    Object.prototype.serialize = function(){
    var serialize = "";
        for(var prop in this){
        if(this.hasOwnProperty(prop)) serialize += prop + ":" + this[prop] + ", ";
        }
    return serialize.replace(/, $/, "");
    }
    
    de modo que obj.serialize() devuelve el objeto en forma de string. claro, el formato lo puedes hacer a tu gusto o necesidad.
  • eliminar valores repetido:
    Código:
    Array.prototype.unique = function(){
    for(var i = 0; i < this.length; i++){
        for(var j = i + 1; j < this.length; j++){
            if(this[i] == this[j]){
            this.splice(j, 1);
            j--;
            }
        }
    }
    }
    
    // ejemplo;
    var array = [1, 'y', 1, 2, 3, true, 'y'].unique();
    // array resulta como un array [1, 'y', 2, 3, true];
    
__________________
la maldad es una virtud humana,
y la espiritualidad es la lucha del hombre contra su maldad.
  #5 (permalink)  
Antiguo 17/09/2009, 12:12
Avatar de Adler
Colaborador
 
Fecha de Ingreso: diciembre-2006
Mensajes: 4.671
Antigüedad: 17 años, 4 meses
Puntos: 126
Respuesta: Contar número de elementos repetidos en array

Hola

Lo que quiero hacer es eliminar los valores repetidos (sin problema) y contar las veces que se repite cada valor. En este segundo caso, he usado lo que me indicas pero al igual que ayer no logro sacar los valores del objeto, siempre me levanta [object Object], después voy Firebug e introduzco el objeto en el seguimiento de expresiones y está ahí. Te dejo el guión

Código javascript:
Ver original
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
  2. <html xmlns="http://www.w3.org/1999/xhtml">
  3. <head>
  4. <meta name="http-equiv" content="Content-type: text/html; charset=UTF-8"/>
  5. <script type="text/javascript">
  6. var arr_limpio = [];
  7. var val_eliminados = [];
  8. Array.prototype.EliminarRepetidos = function () {
  9. var cantidad = {};
  10. for(var i = 0; i < this.length; i++){
  11. if(!(this[i] in cantidad)) {
  12. cantidad[this[i]] = 0;
  13. arr_limpio.push(this[i]);
  14. cantidad[this[i]]++;
  15. } else {
  16. val_eliminados.push(this[i]);
  17. cantidad[this[i]]++;
  18. }
  19. }
  20. return(cantidad)
  21. }
  22.  
  23.  
  24. function ContarRepetidos(valores) {
  25. var val = valores;
  26. array = val.split('');
  27. obj = array.EliminarRepetidos();
  28. alert(obj) // [object Objecto]
  29. alert("Arreglo Original: " + array + "\nArreglo Limpio: " +arr_limpio + "\nValores Eliminados: " + val_eliminados)
  30. }
  31. </script>
  32. </head>
  33. <body>
  34. <a href="javascript:void(0);" onclick="ContarRepetidos('1532345356783950');">Ver</a>
  35. </body>
  36. </html>

Gracias
__________________
Los formularios se envían/validan con un botón Submit
<input type="submit" value="Enviar" style="background-color:#0B5795; font:bold 10px verdana; color:#FFF;" />
  #6 (permalink)  
Antiguo 17/09/2009, 15:12
Avatar de zerokilled
Javascripter
 
Fecha de Ingreso: abril-2009
Ubicación: Isla del Encanto, La Borinqueña [+>==]
Mensajes: 8.050
Antigüedad: 15 años
Puntos: 1485
Respuesta: Contar número de elementos repetidos en array

pues que tal si usas la funcion serialize como te mostre en el mensaje anterior.
Código:
alert(obj.serialize()) // [object Objecto]
cuando le hacemos alert a un objeto este utiliza toString. por eso un array te muestra los elementos pero un objeto siempre te mostrara [object Object].
__________________
la maldad es una virtud humana,
y la espiritualidad es la lucha del hombre contra su maldad.
  #7 (permalink)  
Antiguo 18/09/2009, 07:08
Avatar de Adler
Colaborador
 
Fecha de Ingreso: diciembre-2006
Mensajes: 4.671
Antigüedad: 17 años, 4 meses
Puntos: 126
Respuesta: Contar número de elementos repetidos en array

zerokilled quiero agradecerte tu compromiso y dedicación con este problema. De nuevo no puedo darte karma, que es lo que te mereces, ya que según las normas del foro, no esparzo el suficiente.

Parece que esta mañana se me encendió la luz. Pensando en como acceder a los valores de cada elemento del objeto, me vino cantidad[arr_limpio[j]], y resulto. Aquí dejo el script por si a alguien le puede ayudar

Código javascript:
Ver original
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
  2. <html xmlns="http://www.w3.org/1999/xhtml">
  3. <head>
  4. <meta name="http-equiv" content="Content-type: text/html; charset=UTF-8"/>
  5. <script type="text/javascript">
  6. var arr_limpio = [];
  7. var val_eliminados = [];
  8. Array.prototype.EliminarRepetidos = function () {
  9. var cantidad = {};
  10.     for(var i = 0; i < this.length; i++){
  11.         if(!(this[i] in cantidad)) {
  12.             cantidad[this[i]] = 0;
  13.             arr_limpio.push(this[i]);
  14.             cantidad[this[i]]++;
  15.         } else {
  16.             val_eliminados.push(this[i]);
  17.             cantidad[this[i]]++;
  18.         }
  19.     }
  20.  
  21. var repeticiones = "";
  22.     for (j=0; j < arr_limpio.length; j++) {
  23.         repeticiones +="El elemento " + arr_limpio[j] + " se repite ------ " + parseInt(cantidad[arr_limpio[j]]-1) +" veces\n"
  24.     }
  25.     alert("Arreglo Original: " + array.toString() + "\nArreglo Limpio: " + arr_limpio.toString() + "\nValores Eliminados: " + val_eliminados.toString() + "\nCantidad de veces que se repite cada elemento\n=======================\n" + repeticiones)
  26. }
  27.  
  28.  
  29. function ContarRepetidos(valores) {
  30. var val = valores;
  31. array = val.split('');
  32. obj = array.EliminarRepetidos();
  33. }
  34. </script>
  35. </head>
  36. <body>
  37. <a href="javascript:void(0);" onclick="ContarRepetidos('1283434536473846390');">Ver</a>
  38. </body>
  39. </html>
__________________
Los formularios se envían/validan con un botón Submit
<input type="submit" value="Enviar" style="background-color:#0B5795; font:bold 10px verdana; color:#FFF;" />
  #8 (permalink)  
Antiguo 18/09/2009, 12:05
Avatar de America|UNK  
Fecha de Ingreso: noviembre-2006
Ubicación: Piura - Perú
Mensajes: 582
Antigüedad: 17 años, 5 meses
Puntos: 56
Respuesta: Contar número de elementos repetidos en array

No se si haz revizado este tema:

http://www.forosdelweb.com/f13/array...script-215906/

pero si lo que quieres es contar solo tienes que editar la función.

PD: Busca array_unique en javascript
__________________
/* El que atiende, entiende..., el que entiende, aprende!.
Desarrollo Web Freelance, Contactar */
  #9 (permalink)  
Antiguo 18/09/2009, 12:53
Avatar de Adler
Colaborador
 
Fecha de Ingreso: diciembre-2006
Mensajes: 4.671
Antigüedad: 17 años, 4 meses
Puntos: 126
Respuesta: Contar número de elementos repetidos en array

Hola

Cita:
Iniciado por America|UNK Ver Mensaje
No se si haz revizado este tema:

http://www.forosdelweb.com/f13/array...script-215906/

pero si lo que quieres es contar solo tienes que editar la función.

PD: Busca array_unique en javascript
Gracias Americ|UNK pero ya resolví lo que me ocupaba. El código está en mi último post
__________________
Los formularios se envían/validan con un botón Submit
<input type="submit" value="Enviar" style="background-color:#0B5795; font:bold 10px verdana; color:#FFF;" />
  #10 (permalink)  
Antiguo 18/09/2009, 16:11
Avatar de zerokilled
Javascripter
 
Fecha de Ingreso: abril-2009
Ubicación: Isla del Encanto, La Borinqueña [+>==]
Mensajes: 8.050
Antigüedad: 15 años
Puntos: 1485
Respuesta: Contar número de elementos repetidos en array

¿que tal? me alegro que al final hayas solucionado tu codigo como lo querias. por otro lado, tu codigo hace algo "chistoso", no te lo tomes a mal por la palabra. presiona varias veces el enlace y veras lo que sucede . para solucionarlo, simplemente mueve dentro de la funcion las siguientes dos lineas.
Código:
var arr_limpio = [];
var val_eliminados = [];
con el unico proposito de animarte a sacar nuevas ideas, o reestructurar tu codigo, o cualquier otra cosa util que le puedas sacar. a continuacion mas o menos el mismo resultado con la base que te estaba ofreciendo. claro, un poquito de modificacion para adaptarlo.
Código:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta name="http-equiv" content="Content-type: text/html; charset=iso-8859-1"/>
<script type="text/javascript">
// Array counting value;
Array.prototype.count_value = function(){
var count = {};
for(var i = 0; i < this.length; i++){
if(!(this[i] in count))count[this[i]] = 0;
count[this[i]]++;
}
return count;
}

// clean Array of repeated values;
Array.prototype.unique = function(){
var array = [];
for(var i = 0; i < this.length; i++){
	for(var j = i + 1; j < this.length; j++){
		if(this[i] == this[j]){
		array = array.concat(this.splice(j, 1));
		j--;
		}
	}
}
return array;
}

// serialize object with custom or predefined format;
Object.prototype.serialize = function(prefix, infix, sufix){
var serialize = "", prefix = prefix || ", ", infix = infix || ":", sufix = sufix || "";
    for(var prop in this){
    if(this.hasOwnProperty(prop)) serialize = serialize.concat(prefix, prop, infix, this[prop], sufix);
    }
return serialize.replace(/^, /, "");
}
</script>
</head>
<body>
<pre>
<script type="text/javascript">
array = "108876441088043".split("");
clean = [].concat(array); // crear copia;
count = clean.count_value();
repeat = clean.unique();
document.write("orignal: ", array.toString(), 
"\nlimpio: ", clean.toString(), 
"\nrepetidos: ", repeat.toString(),
count.serialize("\nElemento ", " se repite ", " veces."));
</script>
</pre>

</body>
</html>
a diferencia de tu codigo, la unica razon por la que he creado los componentes separados es para extenderlo a otras areas y tener controles mas especificos.
__________________
la maldad es una virtud humana,
y la espiritualidad es la lucha del hombre contra su maldad.

Última edición por zerokilled; 18/09/2009 a las 16:18
  #11 (permalink)  
Antiguo 19/09/2009, 04:43
Avatar de Adler
Colaborador
 
Fecha de Ingreso: diciembre-2006
Mensajes: 4.671
Antigüedad: 17 años, 4 meses
Puntos: 126
Respuesta: Contar número de elementos repetidos en array

Hola

No me había dado cuenta que las tenía globales, la verdad es que lo probé una vez, funcionó y no me volví a plantearme nada mas.

En cuanto a la alternativa que me ofreces, me parece simple genial. De hecho será el que use. Solo tengo un par de dudas referente a unas lineas que no entiendo

Código:
var serialize = "", prefix = prefix || ", ", infix = infix || ":", sufix = sufix || "";
De esta linea no entiendo nada. Veo operadores, se le da valores a las variables, etc...

Código:
return serialize.replace(/^, /, "");
De esta otra no entiendo la expresión

Código:
clean = [].concat(array); // crear copia;
Y por último de esta no entiendo los corchetes, supongo que es para crear una matriz

Gracias
__________________
Los formularios se envían/validan con un botón Submit
<input type="submit" value="Enviar" style="background-color:#0B5795; font:bold 10px verdana; color:#FFF;" />
  #12 (permalink)  
Antiguo 19/09/2009, 05:49
Avatar de zerokilled
Javascripter
 
Fecha de Ingreso: abril-2009
Ubicación: Isla del Encanto, La Borinqueña [+>==]
Mensajes: 8.050
Antigüedad: 15 años
Puntos: 1485
Respuesta: Contar número de elementos repetidos en array

hola Adler,
  • Cita:
    var serialize = "", prefix = prefix || ", ", infix = infix || ":", sufix = sufix || "";
    en esa linea mas bien se define una serie de variables, especificamente cuatro. no se cual es exactamente la parte que te desorienta pero aqui va. esa linea es el equivalente de...
    Código:
    var serialize = "";
    var prefix = prefix || ", ";
    var infix = infix || ":";
    var sufix = sufix || "";
    
    la coma(,) tiene un uso muy limitado y segun la circunstancia que se aplique tiene significado diferente. por ejemplo en la definicion (o llamada) de funcion es para separar una lista de argumentos, en un bucle for para separar las evaluaciones, y en la definicion de variables para evaluar multiples expresiones. dudo que aqui sea tu duda pero por si acaso.

    lo que quizas te sea un poco complejo comprender es la expresion variable || expresion. es una forma util y corta de dar valores predeterminado a los argumentos cuando estos no "poseen" un valor. o sea, la expresion es lo mismo que...
    Código:
    if(!argumento) argumento = valor_predeterminado;
    
    la parte crucial es que se usa un operador logico llamado OR (||). quizas la confusion es porque acostumbramos a usar operadores logicos dentro de un condicional y se interpreta como ejecutar un bloque de codigo si uno de los argumentos evalua a cierto. sin embargo, fuera de los condicionales los operadores logicos operan un tanto diferente. la forma que opera OR es evaluando el primero argumento. si al evaluar a boolean este resulta ser true, la expresion devuelve el primer argumento. por el contrario, si este primer agumento evalua a false se devuelve el segundo argumento. quizas ahora entiendas porque puse entre comillas la palabra poseen en el parrafo anterior. mas bien cualquier expresion que evalue a false hara que se asigne un valor predeterminado. o sea, si usaramos la funcion pasando como parametros "" (string vacio), false, null, 0 (cero) o undefined se evaluaran como false.
  • Cita:
    return serialize.replace(/^, /, "");
    esta linea mas bien tiene particular efecto cuando se utiliza los valores predeterminado. el formato predeterminado se compone de prefix, propiedad, infix, valor, sufix, por lo que la cadena comenzaria (como ejemplo) ", 0:8". como proposito estetico pense que no era un formato aceptable que la cadena comenzara con una coma y espacio. por supuesto, tu lo adaptas como mejor te guste. la razon por la que escogi ese formato era para adaptarlo mas al estilo json de modo que si fuera necesario se pueda volver a reconstruir el objeto.
  • Cita:
    clean = [].concat(array); // crear copia;
    probablemente sabras que en javascript no tenemos la habilidad de "punteros" como otros lenguajes PHP, C, entre otros mas. sin embargo, javascript tiene unas normas de cuando crear referencias o copias segun el tipo de valor. tal es el caso de los arrays donde asignando un array, previamente almacenado en variable, a otra variable se crea una referencia a la misma memoria. entre las soluciones de crear copias de array, esta me parece la mas corta y excelente. por tanto, en este caso se crea un array literal con el unico proposito de usar el metodo concat el cual crea una copia de su argumento y devuelve un nuevo array uniendo ambos. pero en este caso, como el array literal esta vacio el resultado es una copia del array pasado como argumento.

@edit 07:19
comentario aparte: gracias a ti he adelantado un codigo que hacia tiempo queria escribir, pero como no le heche ganas, no tenia nada hasta el momento. pero sobre todo, gracias a tus dudas mejore el codigo a diferencia de como un principio lo tenia visualizado.
__________________
la maldad es una virtud humana,
y la espiritualidad es la lucha del hombre contra su maldad.

Última edición por zerokilled; 19/09/2009 a las 08:21 Razón: arreglando terminos
  #13 (permalink)  
Antiguo 19/09/2009, 07:32
Avatar de Adler
Colaborador
 
Fecha de Ingreso: diciembre-2006
Mensajes: 4.671
Antigüedad: 17 años, 4 meses
Puntos: 126
Respuesta: Contar número de elementos repetidos en array

Perfectas y muy atendibles tus explicaciones. Me alegra saber que yo también te he ayudado, aunque haya sido de manera indirecta

Gracias otra vez y un saludo
__________________
Los formularios se envían/validan con un botón Submit
<input type="submit" value="Enviar" style="background-color:#0B5795; font:bold 10px verdana; color:#FFF;" />
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 08:51.