【发布时间】:2014-04-29 07:14:41
【问题描述】:
我有这个对象:
{ foo: 1, bar: 2, cheese: 3 }
我想打乱元素,所以变成:
{ bar: 2, cheese: 3, foo: 1 }
或其他某种组合。有这样做的功能吗?这是因为我想在使用 JSON.stringify 时产生不同的结果。我在互联网上能找到的唯一答案是在数组中洗牌。
谢谢。
【问题讨论】:
标签: javascript object shuffle
我有这个对象:
{ foo: 1, bar: 2, cheese: 3 }
我想打乱元素,所以变成:
{ bar: 2, cheese: 3, foo: 1 }
或其他某种组合。有这样做的功能吗?这是因为我想在使用 JSON.stringify 时产生不同的结果。我在互联网上能找到的唯一答案是在数组中洗牌。
谢谢。
【问题讨论】:
标签: javascript object shuffle
JS 对象属性没有内在顺序。大多数 JS 运行时都会保留添加键的顺序,但这不是语言要求,您不应该依赖它。例如,JSON.stringify 总是按字母顺序序列化键或随机化它们是完全有效的。
如果顺序很重要,您可能会保留一组两个数组来跟踪键和值。
【讨论】:
对象属性(截至 2014 年)没有定义的顺序,并且没有语言支持定义或更改属性的顺序。根据语言规范,不必以任何方式保留顺序。
如果你想要一个定义好的顺序,你应该使用一个数组。
【讨论】:
要随机化对象中属性的顺序,您可以访问键,将它们打乱,然后组装一个新对象。这是一个函数:
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));
【讨论】:
你可以创建一个 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) 一样使用它
你需要将你的对象转换成一个数组...
【讨论】:
属性没有顺序,但这个技巧对我有用(需要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 }
【讨论】: