If I have this JS object literal:
var foo = { Sussy: 4, Billy: 5, Jimmy: 2, Sally: 1 };
How can I create a new, sorted object literal:
var bar = { Sally: 1, Jimmy: 2, Sussy: 4, Billy: 5 };
Advertisement
Answer
Re: How to sort a JS Object?
Answer: You can’t. So instead, you need a more sophisticated data structure. You have many options:
- You can use a separate array to hold the order of the object’s keys. (This is what @Felix Kling’s answer demonstrates.) Good: fast retrieval via order or name. Bad: needs a second data structure that must be kept synched with the first.
- Instead of the Object simply holding properties and values, the properties could hold Objects which hold the values and a sort order. Good: 1 data structure. Fast lookup by property name. Bad: slow lookup by order (need to scan the structure). Slow sorting.
- Use an array, with elements consisting of Objects that hold the key and the value. Good: 1 data structure. Fast lookup by order. Fast sorting. Bad: slow lookup by property name (need to scan the structure).
I recommend solution 3 since it uses the JS mechanics to manage the ordering.
Examples:
// Object holds sort order: (Solution 2) var foo = { Suzy: {v: 4, order: 0}, Billy: {v: 5, order: 1}, Jimmy: {v: 2, order: 2}, Sally: {v: 1, order: 3} }; // Array holds keys: (Solution 3) var woof = [ {k: 'Suzy', v: 4}, {k: 'Billy', v: 5}, {k: 'Jimmy', v: 2}, {k: 'Sally', v: 1} ]; // Sort the woof array by the key names: woof.sort(function(a, b) { return a.k.localeCompare(b.k); }); // The third key and value: woof[2].k; // the third key woof[2].v; // the third value
Edited: updated code to fix typo. Thank you, @Martin Fido