Array-Sort mit SortierFunktion
sebush
- javascript
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?
[{
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.
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
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)
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