我有这个对象:
{ foo: 1, bar: 2, cheese: 3 }
我想要洗牌元素,所以它变成了:
{ bar: 2, cheese: 3, foo: 1 }
或其他一些组合。有这个功能吗?这是因为我想在其上使用JSON.stringify
时产生不同的结果。我能在互联网上找到的唯一答案是指在数组中改组对象。
感谢。
答案 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));