Ver Mensaje Individual
  #15 (permalink)  
Antiguo 13/06/2012, 12:27
Avatar de intergus
intergus
 
Fecha de Ingreso: mayo-2007
Mensajes: 126
Antigüedad: 17 años
Puntos: 3
Respuesta: Array ordenar y eliminar duplicados

Madre mía la que he liado....

Bueno, habeis profundizado a niveles en los que ni pensaba.

La idea de ordenación era porque me di cuenta de que el sort ordenaba así:

Amigo Cola abad bebe

Y lógicamente, al menos quería que lo hiciese así:
Amigo abad bebe Cola

Además era imprescindible que el array resultante mantuviese sus características originales, lo que estaba en mayúsculas o minúsculas, que siguiese así.

Para ello he encontrado una solución que no se si la más acertada, pero funciona bien, al menos lo que he probado

Básicamente lo ordena en estos pasos:
1) mapea la posición del array original
2) convierte a minusculas para igualar todo y ordena siendo todo minusculas y una vez obtenido el orden correcto de los indices con el todominusculas, monta o recompone un nuevo array con los valores del original, siguiendo el orden obtenido cuando ordenó las minusculas. Bueno creo que se ve lo que hace en el código.

function ordenAlfa(arr){
var map = []; // array temporal de posición y valor
var result = []; // array final con el resultado ya ordenado
// recorre array original pasándo al array map el valor y posición de cada elemento
for (var i=0, length = arr.length; i < length; i++) {
map.push({
// recuerda la posición en el array original
index: i,
// evalua el valor a ordenar
value: arr[i].toLowerCase()
});
}
// ordenando el array map que contiene los valores en minusculas
map.sort(function(a, b) {
return a.value > b.value ? 1 : -1;
});
// copia los valores ya ordenados al array resultado, usando la posición ordenada
// pero usando el valor del array original
for (var i=0, length = map.length; i < length; i++) {
result.push(arr[map[i].index]);
}
return result;
}

Una vez aquí ya tengo un array ordenado y elimino los duplicados con esta función, pasandole el array ya ordenado

function array_unique(arU){
if (arU.length>1){
var arrUnique=new Array(arU[0]);
for (i=1;i<arU.length;i++){
if(arU[i]!=arrUnique[arrUnique.length-1]){
arrUnique.push(arU[i]);
}
}
return arrUnique;
}else{
return arU;
}
}

Puede que no esté perfecto y seguro que sometido a algún array concreto o más especial, es posible que falle, pero para lo que yo lo requería, de momento, va de lujo.

Gracias a todos, y si se puede simplificar sin perder funcionalidad, pues mejor aún.