javascript将对象属性与其值进行混洗
javascript shuffling object properties with their values
大家好,
我想实现的是打乱对象的所有属性,包括它们的值。。。
对象:
var numbers = { one : 1, two : 2, three : 3};
结果:
Object {two: 2, one: 1, three: 3}
或任何其他变体
我尝试过几种数组洗牌方法,但都不适用…
从ECMAScript 2015(ES2015,又名ES6)开始,对象属性有一个顺序(以前没有):
- 让键成为一个新的空列表
- 对于O的每个属性键P,它是一个整数索引,按数字索引升序排列
- 添加P作为键的最后一个元素
- 对于O的每个自己的属性键P,它是字符串但不是整数索引,按属性创建顺序
- 添加P作为键的最后一个元素
- 对于属于Symbol的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));
实时示例
这是排序的,而不是混洗的,但您可以通过以下几种方式中的任何一种进行混洗,而不是sort
,如本问题答案中所述。
这适用于ES2015+JavaScript引擎。我并不是说(以这种方式使用财产顺序)是一件值得做的事情。:-)
你可能会说这有点滥用reduce
,但这让我只能用一个大的表达方式。(你可能会进一步争辩说,这对我来说是一件愚蠢的事情。:-)
对象是无序的。有些浏览器可能会按字母顺序对它们的键进行排序,但这超出了任何规范的范围,因为规范中说这是无序的。
但你能做的是:
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]);});
相关文章:
- 引用对象中的通用值
- jQuery匹配JSON对象的部分文本
- 节点导出返回一个空对象
- 如何在Javascript中将JSon对象转换为数组
- 我可以在json对象中添加一个函数吗
- 使用JS将数组转换为json对象
- 全局变量和全局对象的属性之间有什么区别吗
- 比较从函数和生成的日期对象
- Javascript,访问一个主要对象模块模式中的每个对象
- 如果使用 lodash 将属性存在于另一个对象中,则向对象添加属性
- 调整窗口大小时,可拖动的对象会出现在容器外部
- 如何使用javascript从主svg对象动态创建svg视图框
- 在 JavaScript 中随机化(洗牌)带有对象的数组
- javascript将对象属性与其值进行混洗
- 如何对JSON对象数组数据进行混洗或随机化
- 从data.json中提取随机数据并对其进行混洗
- 电子邮件列表/集合使用下划线/短划线进行混洗和配对
- 如何洗牌一个对象
- 如何在悬停时以规则的时间间隔对图像进行混洗
- 每次进入网站时都加载并混洗视频