Autor Tema: [duda] ordenar un array con claves repetidas  (Leído 463 veces)

Desconectado ceiboart

  • PHPerit@
  • *
  • Mensajes: 20
  • Karma: 0
  • Nuev@ PHPer@
    • Ver Perfil
[duda] ordenar un array con claves repetidas
« en: 31 de Marzo de 2013, 23:57:49 pm »
Hola
Tengo una duda con un ejercicio
Debo ordenar un array de objetos similar a este:
A =[{color:’rojo’, class:9},
   {color:'azul', class:2},
   {color:'amarillo', class:5},
   {color:'verde', class:9}
   ];
Dicho array podría tener una longitud mayor, pero lo acorte un poco
Ahora les presento el problema:
a: debo crear un nuevo array donde los elementos estén ordenados de forma descendente según la propiedad class de cada miembro
b: debo listarlos en consola (como dije en orden descendente)
la cuestión está en que la propiedad class puede tener valores repetidos
las keys resultantes no deben ser necesariamente los valores de los atributos class, por lo que pensé en algo como lo siguiente:
Código: [Seleccionar]
<html>
<head>
<script type="text/javascript">
arrayOriginal = [{color:'rojo', class:9},
{color:'rojo', class:9},
{color:'azul', class:2},
{color:'amarillo', class:5},
{color:'verde', class:9}
];
nuevoArray = []; //aquí irá el array ordenado
totalEsperados = arrayOriginal.length;
copiados = 0; //cantidad de elementos copiados hasta el momento
while(copiados < totalEsperados) //mientras que la cantidad de copiados sea inferior a los esperados continuar
{
if (!nuevoArray[arrayOriginal[copiados].class])
{
//comprobamos si un elemento cuya key sea igual al atributo class existe o no
//si no existe lo creamos
nuevoArray[arrayOriginal[copiados].class] = arrayOriginal[copiados];
copiados++; //incrementamos la cantidad de copiados
continue; //siguiente buelta
}
else
{
/*si el elemento ya existía tenemos un problema. las keys no pueden repetirse, por los que
el nuevo elemento a añadir tendrá números con coma flotante*/
console.log('elemento ya existia, se creara otro en su lugar');
indice = 0;
while(true) //parece un bucle infinito, pero es seguro que algún día se detendrá XD
{
/*tenía un problema al tratar de usar decimales, así que pase todo a string y luego lo volví
a convertir en float*/
ToString = parseFloat(arrayOriginal[copiados].class.toString() + '.' + indice);
if (!nuevoArray[ToString])
{
//si no existe el elemento, lo copiamos, incrementamos el valor de "copiados" y finalizamos el bucle
nuevoArray[ToString] = arrayOriginal[copiados];
console.log('creado elemento ' + nuevoArray[ToString].class);
copiados++;
break;
}
else
{
/*si ya existía, pues incrementamos el índice y seguimos con la ejecución de este while
hay que recordar que puede haber muchos atributos class repetidos*/
indice++;
continue;
}
}
}
}//el bucle termino :D
nuevoArray.forEach(listar);//aquí comienza el rollo
function listar(element,id,array)
{
console.log ( id + '=>' + element);//en teoría debería listar uno a uno los elementos, pero no es así D:
}
//lo de abajo si funciona :D
for (var INDICE in nuevoArray)
{
console.log ( INDICE + '=>' + nuevoArray[INDICE]);
}
console.log(nuevoArray);
//mostramos todo los elementos para verificar si salió bien
</script>
</head>
<body>
</body>
</html>

el código funciona casi perfecto, pero el forEach no me itera sobre los elementos cuyas claves
Sean de tipo float
no obstante, si hago un console.log(nuevoArray) allí están todos los elementos en perfecto orden
Con For (x in y) funciona perfecto
Pero bueno, la pregunta es
existe alguna forma más simple de hacer esto (lo de ordenar el array)?
Espero sus comentarios
« Última modificación: 01 de Abril de 2013, 00:18:57 am por ceiboart »

Comunidad PHPeros

[duda] ordenar un array con claves repetidas
« en: 31 de Marzo de 2013, 23:57:49 pm »