-
红颜莎娜
对这个问题的其他回答是过时的,永远无法与实现现实相匹配,而且正式既然ES6/ES 2015规范已经发布,就会变得不正确。看见关于性质迭代顺序在……里面探索ES6作者:Axel Rauschmayer:对属性键进行迭代的所有方法都是按照相同的顺序进行的:首先,所有数组索引,数字排序。然后按照创建的顺序,所有字符串键(不是索引)。然后所有的符号,按照它们被创造的顺序。是的,JavaScript对象是实际上,它们的键/属性的顺序可以更改。下面是按照对象的键/属性按字母顺序对其进行排序的方法:const unordered = { 'b': 'foo', 'c': 'bar', 'a': 'baz'};console.log(JSON.stringify(unordered));// → '{"b":"foo","c":"bar","a":"baz"}'const ordered = {};Object.keys(unordered).sort().forEach(function(key) { ordered[key] = unordered[key];});console.log(JSON.stringify(ordered));// → '{"a":"baz","b":"foo","c":"bar"}'使用var而不是const为了与ES5引擎兼容。
-
慕田峪9158850
JavaScript对象1没有命令。尝试“整理”它们是毫无意义的。如果要迭代对象的属性,可以对键进行排序,然后检索相关的值:var myObj = { 'b': 'asdsadfd', 'c': 'masdasaf', 'a': 'dsfdsfsdf' }, keys = [], k, i, len;for (k in myObj) { if (myObj.hasOwnProperty(k)) { keys.push(k); }}keys.sort();len = keys.length;for (i = 0; i < len; i++) { k = keys[i]; console.log(k + ':' + myObj[k]);}交替实现Object.keys幻想:var myObj = { 'b': 'asdsadfd', 'c': 'masdasaf', 'a': 'dsfdsfsdf' }, keys = Object.keys(myObj), i, len = keys.length;keys.sort();for (i = 0; i < len; i++) { k = keys[i]; console.log(k + ':' + myObj[k]);}
-
犯罪嫌疑人X
很多人都提到“对象不能排序”但在那之后,他们给了你一个可行的解决方案。矛盾,不是吗?没有人提到为什么这些解决办法是有效的。它们是这样的,因为在大多数浏览器的实现中,对象中的值都是按照添加的顺序存储的。这就是为什么如果您从已排序的键列表中创建新对象,它将返回预期的结果。我认为我们还可以增加一个解决方案-ES5功能方法:function sortObject(obj) {
return Object.keys(obj).sort().reduce(function (result, key) {
result[key] = obj[key];
return result;
}, {});}以上版本(格式为“一行”):function sortObject(o) {
return Object.keys(o).sort().reduce((r, k) => (r[k] = o[k], r), {});}对上述例子的简短解释(如评论中所问):Object.keys在提供的对象中给出一个键列表(obj或o),然后我们使用默认排序算法对这些数据进行排序,下一步是.reduce用于将该数组转换回对象,但这次使用的是所有的键排序。