javascript 将对象属性及其值打乱

Wra*_*ker 1 javascript

大家好,

我想要实现的是洗牌所有对象的属性,包括它们的值......

目的:

    var numbers = { one : 1, two : 2, three : 3};
Run Code Online (Sandbox Code Playgroud)

结果:

     Object {two: 2, one: 1, three: 3} 
Run Code Online (Sandbox Code Playgroud)

或任何其他变体

我尝试过几种数组洗牌方法,但没有一个对我有用......

T.J*_*der 6

从 ECMAScript 2015(ES2015,又名 ES6)开始,对象属性确实有顺序(之前没有):

  1. keys成为一个新的空列表。
  2. 对于O的每个自己的属性键P来说,它是一个整数索引,按数字索引升序排列
    • 添加P作为keys的最后一个元素。
  3. 对于O的每个自己的属性键P(它是字符串但不是整数索引),按属性创建顺序
    • 添加P作为keys的最后一个元素。
  4. 对于作为符号的 O的每个自己的属性键P ,按照属性创建顺序
    • 添加P作为keys的最后一个元素。
  5. 返回

因此,现在可以通过创建一个新对象并按照您希望属性出现的顺序向其添加属性来执行您所要求的操作:

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));
Run Code Online (Sandbox Code Playgroud)

实例

这是排序的,而不是洗牌的,但sort您可以通过多种方式中的任何一种进行洗牌,如本问题的答案中所述。

这适用于 ES2015+ JavaScript 引擎。我并不是说(以这种方式使用属性顺序)是一件值得做的事情。:-)

你可能会说这有点滥用reduce,但它让我将所有内容保留在一个大的表达式中。(你可能会进一步争辩说,这对我来说是一件愚蠢的事情。:-))