I have an array of objects that I must sort based on two criteria. I've come up with a solution but I'd like to know if there is a better way to do it.
Assume a list of devices:
[
{"battery_level": 0.45, "network_status": "ok"},
{"battery_level": 0.45, "network_status": "ok"},
{"battery_level": 0.50, "network_status": "lost"},
{"battery_level": 0.35, "network_status": "lost"},
{"battery_level": 0.75, "network_status": "ok"},
{"battery_level": 0.05, "network_status": "lost"},
{"battery_level": 0.75, "network_status": "lost"}
]
All lost devices must be on top and sorted by battery status ascending, so that it looks like this once sorted:
[
{"battery_level":0.05,"network_status":"lost"},
{"battery_level":0.35,"network_status":"lost"},
{"battery_level":0.5,"network_status":"lost"},
{"battery_level":0.75,"network_status":"lost"},
{"battery_level":0.75,"network_status":"ok"},
{"battery_level":0.45,"network_status":"ok"},
{"battery_level":0.45,"network_status":"ok"}
]
var devices = JSON.parse(document.getElementById('devices').innerHTML),
lostDevices,
sortBatteryLevelAsc,
sortNetworkStatusLostAsc,
i;
devices.sort(function (dev0, dev1) {
return dev0.network_status === 'lost' ? -1 : 1;
});
lostDevices = devices.filter(function (dev) {
return dev.network_status === 'lost';
});
lostDevices.sort(function (dev0, dev1) {
return dev0.battery_level <= dev1.battery_level ? -1 : 1;
});
console.clear();
console.log(devices);
Array.prototype.splice.apply(devices, [0, lostDevices.length].concat(lostDevices));
console.log(devices);
Is it smart enough, or is there a smarter way to do it?