Friday, May 17, 2024
 Popular · Latest · Hot · Upcoming
102
rated 0 times [  104] [ 2]  / answers: 1 / hits: 55699  / 14 Years ago, tue, february 8, 2011, 12:00:00

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
}
}

More From » arrays

 Answers
60

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


[#93844] Sunday, February 6, 2011, 14 Years  [reply] [flag answer]
Only authorized users can answer the question. Please sign in first, or register a free account.
collinisaaka

Total Points: 194
Total Questions: 105
Total Answers: 104

Location: Tonga
Member since Tue, Nov 30, 2021
3 Years ago
;