javascript将对象属性与其值进行混洗

javascript shuffling object properties with their values

本文关键字:混洗 对象 属性 javascript      更新时间:2023-09-26

大家好,

我想实现的是打乱对象的所有属性,包括它们的值。。。

对象:

    var numbers = { one : 1, two : 2, three : 3};

结果:

     Object {two: 2, one: 1, three: 3} 

或任何其他变体

我尝试过几种数组洗牌方法,但都不适用…

从ECMAScript 2015(ES2015,又名ES6)开始,对象属性有一个顺序(以前没有):

  1. 成为一个新的空列表
  2. 对于O的每个属性键P,它是一个整数索引,按数字索引升序排列
    • 添加P作为的最后一个元素
  3. 对于O的每个自己的属性键P,它是字符串但不是整数索引,按属性创建顺序
    • 添加P作为的最后一个元素
  4. 对于属于Symbol的O的每个属性键P,按属性创建顺序
    • 添加P作为的最后一个元素
  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));

实时示例

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

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

你可能会说这有点滥用reduce,但这让我只能用一个大的表达方式。(你可能会进一步争辩说,这对我来说是一件愚蠢的事情。:-)

对象是无序的。有些浏览器可能会按字母顺序对它们的键进行排序,但这超出了任何规范的范围,因为规范中说这是无序的。

但你能做的是:

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]);});