sebush: Array-Sort mit SortierFunktion

hi leutz,

brauche Hilfe bei einer speziellen Sortierfunktion:

[{  
  sort: 0.2,  
  title: "bla"  
},  
{  
  sort: 0.4,  
  title: "blub"  
},  
{  
  sort: 0.15,  
  title: "foo",  
  active: true  
},  
{  
  sort: 0.43,  
  title: "bar"  
}]

ich möchte nun dass die "active:true" ganz oben erscheinen und dann der rest per "sort" ausgegeben wird:

einzeln ist beides kein problem:

array.sort(function(a,b) { return parseFloat(b.sort) - parseFloat(a.sort) })  
  
//und  
  
array.sort(function(a,b) {  
        if(b.active){b.active=1}else{b.active=0}  
        if(a.active){a.active=1}else{a.active=0}  
        return parseFloat(b.active) - parseFloat(a.active)  
      })

nur wie kombiniere ich das ganze nun?

  1. [{

    sort: 0.2,
      title: "bla"
    },
    {
      sort: 0.4,
      title: "blub"
    },
    {
      sort: 0.15,
      title: "foo",
      active: true
    },
    {
      sort: 0.43,
      title: "bar"
    }]

      
    Ich bin mit dem ganzen nicht so vertraut. Aber, die { ... } sind doch selbst Objekte (der gleichen Art) oder? In nicht-Javascript also z.B. Java würde ich diesen Objekten eine Vergleichsschnittstelle mitgeben, und dann die Vergleichsfunktion zunächst nach active, und dann nach sort sortieren, wobei du den anderen Objekten dann natürlich auch eine active=false Eigenschaft geben musst.
    
  2. Hallo sebush,

    du musst in zwei Stufen vergleichen:

    1. Vergleich: (active)
       wenn ungleich: return 1 oder -1
       wenn gleich:
       2. Vergleich (sort)
          return 1 oder -1

    Gruß, Jürgen

  3. nur wie kombiniere ich das ganze nun?

    bei active==true einfach auf sort noch eine positive Zahl (außerhalb des üblichen Zahlenbereichs) beim Vergleich addieren:

    array.sort(function(a,b) {  
     var as=parseFloat(a.sort) + (a.active)?3000:0;  
     var bs=parseFloat(b.sort) + (b.active)?3000:0;  
     return bs-as;  
    })
    

    (untested)

    1. gruss in die runde

      nur wie kombiniere ich das ganze nun?

      bei active==true einfach auf sort noch eine positive Zahl (außerhalb des üblichen Zahlenbereichs) beim Vergleich addieren:

      ... oder das ganze auf teilprobleme herunterbrechen
      und diese dann mit ganz viel logik erschlagen ...

      [{  
        
        sort: 0.1,  
        title: "4th"  
      }, {  
        sort: 0.4,  
        title: "7th"  
      }, {  
        sort: 0.3,  
        title: "6th"  
      }, {  
        sort: 0.25,  
        title: "2nd",  
        active: true  
      }, {  
        sort: 0.15,  
        title: "1st",  
        active: true  
      }, {  
        sort: 0.35,  
        title: "3rd",  
        active: true  
      }, {  
        sort: 0.2,  
        title: "5th"  
        
      }].sort(function (a, b) {  
        
        var diff = a.sort - b.sort;  
        return (  
        
          (a.active && b.active)  
          ? diff  
          : (a.active ? -1 : (b.active ? 1 : diff))  
        
        );  
      });
      

      so long - peterS. - pseliger@gmx.net

      --
      »Because objects in JavaScript are so flexible, you will want to think differently about class hierarchies.
      Deep hierarchies are inappropriate. Shallow hierarchies are efficient and expressive.« - Douglas Crockford
      ie:( fl:) br:> va:( ls:& fo:) rl:) n3;} n4:} ss:} de:µ js:} mo:? zu:]