最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

javascript shuffling object properties with their values - Stack Overflow

programmeradmin1浏览0评论

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

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

Share Improve this question asked Oct 22, 2014 at 8:49 WrackerWracker 6191 gold badge11 silver badges32 bronze badges 4
  • Shuffle object properties? For which purpose? I mean: if it's for visualization then shuffle output, not properties...it doesn't matter where they are (and in JS order also is unspecified). – Adriano Repetti Commented Oct 22, 2014 at 8:52
  • Two question: 1) What have you tried? 2) Why are you trying to do this? – Aadit M Shah Commented Oct 22, 2014 at 8:52
  • possible duplicate of Sorting JavaScript Object by property value – JJJ Commented Oct 22, 2014 at 8:53
  • I just wanted to know if there is such a possibility. – Wracker Commented Oct 22, 2014 at 9:00
Add a ment  | 

2 Answers 2

Reset to default 6

As of ECMAScript 2015 (ES2015, aka ES6), object properties do have an order (they didn't before):

  1. Let keys be a new empty List.
  2. 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.
  3. 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.
  4. For each own property key P of O that is a Symbol, in property creation order
    • Add P as the last element of keys.
  5. 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. :-) )

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]);});
发布评论

评论列表(0)

  1. 暂无评论