Sorting object property by values
Move them to an array, sort that array, and then use that array for your purposes. Here's a solution:
var maxSpeed = { car: 300, bike: 60, motorbike: 200, airplane: 1000, helicopter: 400, rocket: 8 * 60 * 60};var sortable = [];for (var vehicle in maxSpeed) { sortable.push([vehicle, maxSpeed[vehicle]]);}sortable.sort(function(a, b) { return a[1] - b[1];});//[["bike", 60], ["motorbike", 200], ["car", 300],//["helicopter", 400], ["airplane", 1000], ["rocket", 28800]]
Once you have the array, you could rebuild the object from the array in the order you like, thus achieving exactly what you set out to do. That would work in all the browsers I know of, but it would be dependent on an implementation quirk, and could break at any time. You should never make assumptions about the order of elements in a JavaScript object.
var objSorted = {}sortable.forEach(function(item){ objSorted[item[0]]=item[1]})
In ES8, you can use Object.entries()
to convert the object into an array:
const maxSpeed = { car: 300, bike: 60, motorbike: 200, airplane: 1000, helicopter: 400, rocket: 8 * 60 * 60};const sortable = Object.entries(maxSpeed) .sort(([,a],[,b]) => a-b) .reduce((r, [k, v]) => ({ ...r, [k]: v }), {});console.log(sortable);
In ES10, you can use Object.fromEntries()
to convert array to object. Then the code can be simplified to this:
const maxSpeed = { car: 300, bike: 60, motorbike: 200, airplane: 1000, helicopter: 400, rocket: 8 * 60 * 60};const sortable = Object.fromEntries( Object.entries(maxSpeed).sort(([,a],[,b]) => a-b));console.log(sortable);
We don't want to duplicate the entire data structure, or use an array where we need an associative array.
Here's another way to do the same thing as bonna:
var list = {"you": 100, "me": 75, "foo": 116, "bar": 15};keysSorted = Object.keys(list).sort(function(a,b){return list[a]-list[b]})console.log(keysSorted); // bar,me,you,foo
Your objects can have any amount of properties and you can choose to sort by whatever object property you want, number or string, if you put the objects in an array. Consider this array:
var arrayOfObjects = [ { name: 'Diana', born: 1373925600000, // Mon, Jul 15 2013 num: 4, sex: 'female' }, { name: 'Beyonce', born: 1366832953000, // Wed, Apr 24 2013 num: 2, sex: 'female' }, { name: 'Albert', born: 1370288700000, // Mon, Jun 3 2013 num: 3, sex: 'male' }, { name: 'Doris', born: 1354412087000, // Sat, Dec 1 2012 num: 1, sex: 'female' }];
sort by date born, oldest first
// use slice() to copy the array and not just make a referencevar byDate = arrayOfObjects.slice(0);byDate.sort(function(a,b) { return a.born - b.born;});console.log('by date:');console.log(byDate);
sort by name
var byName = arrayOfObjects.slice(0);byName.sort(function(a,b) { var x = a.name.toLowerCase(); var y = b.name.toLowerCase(); return x < y ? -1 : x > y ? 1 : 0;});console.log('by name:');console.log(byName);