Javascript: problema con sort

LinkinTC

Hola!

Tengo una duda con el sort de javascript y no acabo de verlo claro...
Trato de ordenar un array a partir de varias propiedades del objeto, pero veo que no me está ordenado como yo quiero.

El orden a seguir es:

  1. topDeal: true
  2. initialDate: más reciente
  3. orderSort: más bajo
  4. duration: menor
  5. shortTitle: alfábetico

Estoy usando esto:

function comparaPlanes(a,b){
			if (a.topDeal == true && b.topDeal == false) {
				return -1;
			}
			if (a.topDeal==false && b.topDeal == true) {
				return 1;
			}
			if (a.topDeal==b.topDeal) {
				return 0;
			}
			if (a.initialDate == null || a.initialDate == ""){
				a.initialDate = "2014-01-01";	
			}
			if (b.initialDate == null || b.initialDate == ""){
				b.initialDate = "2014-01-01";	
			}
			var aInitialDate = new Date(a.initialDate);
			var bInitialDate = new Date(b.initialDate);
			
		if (aInitialDate > bInitialDate){
			return -1;
		}
		if (aInitialDate < bInitialDate){
			return 1;
		}
		if (aInitialDate == bInitialDate){
			return 0;
		}
		if (a.orderSort == null || a.orderSort == ""){
			a.orderSort = 999;	
		}
		if (b.orderSort == null || b.orderSort == ""){
			b.orderSort = 999;	
		}
		var aInt = parseInt(a.orderSort);
		var bInt = parseInt(b.orderSort);

		if (aInt < bInt)
			return 1;
		if (aInt > bInt)
			return -1;
	
		if (aInt == bInt){	
			return 0;
		}
		var aFinalDate = new Date(a.finalDate);
		var bFinalDate = new Date(b.finalDate);
		var aDuration = parseInt(aFinalDate.getTime()) - parseInt(aInitialDate.getTime());
		var bDuration = parseInt(bFinalDate.getTime()) - parseInt(bInitialDate.getTime());
		
		if (aDuration < bDuration)
			return 1;
		
		if (aDuration > bDuration)
			return -1;

		if (aDuration == bDuration) {
			return 0;
		}
		if (a.shortTitle < b.shortTitle)
			return -1;
		if (a.shortTitle > b.shortTitle)
			return 1;
			
		return 0;
	}

Aunque antes tenía: en vez de devolver 0 cada vez que una propiedad es igual, comprobar la siguiente; pero tampoco me ordena como quiero.
Creo que tengo un lío de cojones y estoy bastante bloqueado..

Alguna ayuda?

Gracias

Merkury

#1 A ver tu quieres ordenar un array en función de sus propiedades, es decir si te haces return -1 ordenar de una forma, con return 0 de otra y con return 1 de otra no?

La historia es que si has de evaluar todas las propiedades en ese orden, tal como lo tienes ahora solo evaluaras hasta que llegues al primer return.

JuAn4k4

Quita todos los return 0; con su if, y añade un return 0 al final del todo.

El orderSort , duration y shortTitle estan al reves que topDeal y date.

orderSort, duration, shortTitle -> Si a > b devuelves 1.
topDeal y date -> si a > b devuelves -1.

1 respuesta
LinkinTC

#3 al final encontré otro modo para hacerlo, pero gracias por la respuesta :)

Usuarios habituales

  • LinkinTC
  • JuAn4k4
  • Merkury