As of ECMAScript 2015 (ES2015, aka ES6), object properties do have an order (they didn't before):
- Let keys be a new empty List.
- For each own property key P of O that is an integer index, in ascending numeric index order
- Add P as the last element of keys.
- For each own property key P of O that is a String but is not an integer index, in property creation order
- Add P as the last element of keys.
- For each own property key P of O that is a Symbol, in property creation order
- Add P as the last element of keys.
- Return keys.
Consequently, it's now possible to do what you asked, by creating a new object and adding the properties to it in the order you want them to appear:
let numbers = { one : 1, two : 2, three : 3};
numbers = Object.keys(numbers)
.map((key) => ({key, value: numbers[key]}))
.sort((a, b) => b.key.localeCompare(a.key))
.reduce((acc, e) => {
acc[e.key] = e.value;
return acc;
}, {});
console.log(JSON.stringify(numbers));
Live Example
That's sorted, not shuffled, but instead of sort
you can shuffle in any of several ways, as outlined in this question's answers.
That works on ES2015+ JavaScript engines. I'm not saying it (using property order this way) a worthwhile thing to do. :-)
You could argue that that's a bit of an abusage of reduce
, but it let me keep it all to one big expression. (Which you could further argue is a silly thing for me to do. :-) )