Reputation: 619
Hello everyone,
what I'd like to achieve is to shuffle all the object's properties including their values...
object:
var numbers = { one : 1, two : 2, three : 3};
result:
Object {two: 2, one: 1, three: 3}
or any other variation
I have tried couple of array shuffle methods but none of them worked for me...
Upvotes: 2
Views: 4744
Reputation: 1075309
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));
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. :-) )
Upvotes: 6
Reputation: 324780
Objects are unordered. Some browsers may sort their keys alphabetically, but this is outside of any specification as the spec says unordered.
But what you can do is this:
var keys = Object.keys(numbers);
// drop your preffered shuffle algorithm here
keys.sort(function(a,b) {return Math.random() - 0.5;});
// now you have random keys!
keys.forEach(function(k) {console.log(numbers[k]);});
Upvotes: 3