大家好,
我想要实现的目标是改变所有对象的属性,包括它们的值...
对象
var numbers = { one : 1, two : 2, three : 3};
结果:
Object {two: 2, one: 1, three: 3}
或任何其他变体
我已经尝试了几种数组shuffle方法,但它们都没有为我工作......
答案 0 :(得分:3)
从ECMAScript 2015(ES2015,又名ES6)开始,对象属性do have an order(他们之前没有):
- 让键成为新的空列表。
- 对于作为整数索引的 O 的每个自有属性键 P ,按升序数字索引顺序
- 添加 P 作为键的最后一个元素。
- 对于 O 的每个属性键 P ,它是一个String但不是整数索引,在属性创建顺序中
- 添加 P 作为键的最后一个元素。
- 对于作为符号的 O 的每个属性键 P ,在属性创建顺序中
- 添加 P 作为键的最后一个元素。
- 返回键。
醇>
因此,现在可以通过创建新对象并按照您希望它们显示的顺序向其添加属性来完成您的要求:
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));
按照this question's answers中的概述,您可以按照以下几种方式进行随机播放,而不是随机播放,而不是sort
。
适用于ES2015 + JavaScript引擎。我不是说(以这种方式使用财产订单)这是值得做的事情。 : - )
你可能会认为这有点像reduce
的滥用,但它让我把它全部放在一个大表达上。 (你可以进一步争辩说这对我来说是个愚蠢的事情。:-))
答案 1 :(得分:2)
对象无序。有些浏览器可能会按字母顺序对其键进行排序,但这超出了任何规范,因为规范说无序。
但你可以做的是:
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]);});