Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to sort a Javascript object, or convert it to an array?

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 }  } 
like image 797
Questioner Avatar asked Feb 08 '11 05:02

Questioner


People also ask

Can you sort an array of objects in JavaScript?

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.

Are objects sorted in JavaScript?

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').


Video Answer


1 Answers

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

like image 149
Raynos Avatar answered Oct 01 '22 08:10

Raynos