是否可以在JavaScript中对象中的元素进行混洗?

时间:2014-04-29 07:14:42

标签: javascript object shuffle

我有这个对象:

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

我想要洗牌元素,所以它变成了:

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

或其他一些组合。有这个功能吗?这是因为我想在其上使用JSON.stringify时产生不同的结果。我能在互联网上找到的唯一答案是指在数组中改组对象。

感谢。

5 个答案:

答案 0 :(得分:7)

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

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

答案 1 :(得分:7)

对象属性没有已定义的顺序,并且没有语言支持来定义或更改属性的顺序。根据语言规范,不必以任何方式保留订单。

如果您想要定义订单,则应使用数组。

答案 2 :(得分:0)

你可以创建一个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)

一样使用它

您需要将对象转换为数组...

答案 3 :(得分:0)

属性没有顺序,但这个技巧对我有用(需要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 }

答案 4 :(得分:0)

要随机化对象中属性的顺序,您可以访问键,对其进行随机排列,然后组装一个新对象。这是一个函数:

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