【问题标题】:Is it possible to shuffle elements within an object in JavaScript?是否可以在 JavaScript 中对对象内的元素进行混洗?
【发布时间】:2014-04-29 07:14:41
【问题描述】:

我有这个对象:

{ foo: 1, bar: 2, cheese: 3 }

我想打乱元素,所以变成:

{ bar: 2, cheese: 3, foo: 1 }

或其他某种组合。有这样做的功能吗?这是因为我想在使用 JSON.stringify 时产生不同的结果。我在互联网上能找到的唯一答案是在数组中洗牌。

谢谢。

【问题讨论】:

    标签: javascript object shuffle


    【解决方案1】:

    JS 对象属性没有内在顺序。大多数 JS 运行时都会保留添加键的顺序,但这不是语言要求,您不应该依赖它。例如,JSON.stringify 总是按字母顺序序列化键或随机化它们是完全有效的。

    如果顺序很重要,您可能会保留一组两个数组来跟踪键和值。

    【讨论】:

      【解决方案2】:

      对象属性(截至 2014 年)没有定义的顺序,并且没有语言支持定义或更改属性的顺序。根据语言规范,不必以任何方式保留顺序。

      如果你想要一个定义好的顺序,你应该使用一个数组。

      【讨论】:

      • 很好的答案 - 感谢您的帮助。可惜我只能接受一个,所以我不得不做出选择……
      【解决方案3】:

      要随机化对象中属性的顺序,您可以访问键,将它们打乱,然后组装一个新对象。这是一个函数:

      let obj = { "a":1, "b":2, "c":3, "d":4 }
      
      function shuffleObject(obj){
          // new obj to return
        let newObj = {};
          // create keys array
        var keys = Object.keys(obj);
          // randomize keys array
          keys.sort(function(a,b){return Math.random()- 0.5;});
        // save in new array
          keys.forEach(function(k) {
              newObj[k] = obj[k];
      });
        return newObj;
      }
      
      console.log(shuffleObject(obj));
      console.log(shuffleObject(obj));
      console.log(shuffleObject(obj));

      【讨论】:

        【解决方案4】:

        你可以创建一个 Shuffle 自定义函数吗?

        function shuffle(o){ //v1.0
            for(var j, x, i = o.length; i; j = Math.floor(Math.random() * i), x = o[--i], o[i] = o[j], o[j] = x);
            return o;
        };
        

        然后像 shuffle(myArray) 一样使用它

        你需要将你的对象转换成一个数组...

        【讨论】:

        • 关于对象而非数组的问题
        • 他不能用 Object 做到这一点,所以我提到了将他的对象转换为数组的想法......如果他这样做,它将起作用。好无用的反对票兄弟'。
        【解决方案5】:

        属性没有顺序,但这个技巧对我有用(需要lodash):

        function shuffle(array) {
          var currentIndex = array.length, temporaryValue, randomIndex;
        
          // While there remain elements to shuffle...
          while (0 !== currentIndex) {
        
            // Pick a remaining element...
            randomIndex = Math.floor(Math.random() * currentIndex);
            currentIndex -= 1;
        
            // And swap it with the current element.
            temporaryValue = array[currentIndex];
            array[currentIndex] = array[randomIndex];
            array[randomIndex] = temporaryValue;
          }
          return array;
        }
        
        function shuffleObject(obj) {
          // Get object key into tmp array in random order
          var keys = this.shuffle(_.keys(obj));
        
          // instantiate new object who will be returned
          var newObj = {};
        
          // Iterate over keys to populate object with same properties in a different order
          keys.forEach(function(elm, index){
            newObj[elm] = obj[elm];
            if(index === keys.length-1){
              return newObj;
            }
          })
        }
        console.log(shuffleObject({ "A": 1, "B": 2, "C": 3, "D": 4 });
        //{ "B": 2, "C": 3, "D": 4,"A": 1 }
        

        【讨论】:

          猜你喜欢
          • 2023-01-15
          • 2010-10-29
          • 2016-02-08
          • 2021-03-20
          • 1970-01-01
          • 1970-01-01
          • 2021-12-31
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多