I have some JSON data that I get from a server. In my JavaScript, I want to do some sorting on it. I think the sort() function will do what I want.
However, it seems that JavaScript is converting the JSON data into an Object immediately on arrival. If I try to use the sort() method, I get errors a-plenty (using Firebug for testing).
I've looked around the net, and everyone seems to say that for one thing, JSON objects are already JavaScript arrays, and also that Objects can be treated just like arrays. Like over on this question, where in one of the answers, a guy says "The [Object object] is your data -- you can access it as you would an array."
However, that is not exactly true. JavaScript won't let me use sort() on my object. And since the default assumption is that they're all the same thing, there don't seem to be any instructions anywhere on how to convert an Object to an Array, or force JavaScript to treat it as one, or anything like that.
So... how do I get JavaScript to let me treat this data as an array and sort() it?
Console log output of my object looks like this (I want to be able to sort by the values in the "level"):
OBJECT JSONdata
{ 1: { displayName: "Dude1", email: "[email protected]<mailto:[email protected]>", lastActive: 1296980700, level: 57, timeout: 12969932837 }, 2: { displayName: "Dude2", email: "[email protected]<mailto:[email protected]>", lastActive: 1296983456, level: 28, timeout: 12969937382 }, 3: { displayName: "Dude3", email: "[email protected]<mailto:[email protected]>", lastActive: 1296980749, level: 99, timeout: 129699323459 } }
Sort an Array of Objects in JavaScriptTo sort an array of objects, you use the sort() method and provide a comparison function that determines the order of objects.
Object property order is not guaranteed in JavaScript, so sorting should be done into an array, not an object (which is what you are referring to as an 'associative array').
Array.prototype.slice.call(arrayLikeObject)
is the standard way to convert and an array-like object to an array.
That only really works for the arguments
object. To convert a generic object to an array is a bit of a pain. Here's the source from underscore.js:
_.toArray = function(iterable) { if (!iterable) return []; if (iterable.toArray) return iterable.toArray(); if (_.isArray(iterable)) return iterable; if (_.isArguments(iterable)) return slice.call(iterable); return _.values(iterable); }; _.values = function(obj) { return _.map(obj, _.identity); };
Turns out you're going to need to loop over your object and map it to an array yourself.
var newArray = [] for (var key in object) { newArray.push(key); }
You're confusing the concepts of arrays and "associative arrays". In JavaScript, objects kind of act like an associative array since you can access data in the format object["key"]
. They're not real associative arrays since objects are unordered lists.
Objects and arrays are vastly different.
An example of using underscore:
var sortedObject = _.sortBy(object, function(val, key, object) { // return an number to index it by. then it is sorted from smallest to largest number return val; });
See live example
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With