有没有办法对JavaScript对象中的键进行sorting/sorting?

例如以下

var data = { 'States': ['NSW', 'VIC'], 'Countries': ['GBR', 'AUS'], 'Capitals': ['SYD', 'MEL'] } for (var item in data) { console.log(item); } 

版画

 States Countries Capitals 

有没有一种方法来按字母顺序sorting,以便打印

 Capitals Countries States 

不在对象本身内:对象的属性集合是无序的。

你可以做的一件事是使用Object.keys() ,并排列数组,然后迭代它。

 Object.keys(data) .sort() .forEach(function(v, i) { console.log(v, data[v]); }); 

不支持ECMAScript第五版的浏览器的补丁(实现):

  • Object.keys

  • Array.forEach

就在这里。 不在ECMAScript标准中,但支持跨浏览器和Node.js,并且显然是稳定的。 请参阅https://stackoverflow.com/a/23202095/645715

编辑 :这将返回一个对象,其中的按键sorting。 您可以使用Object.keys(...)从对象中获取有序的键。

为什么要担心对象键序? 这些差异在一些应用程序中可能很重要,例如使用表示XML的xml2jsparsingXML作为嵌套对象,并使用XML标记作为散列键。

有一些注意事项:

  • 看起来像整数的键首先以数字顺序出现。
  • 看起来像string的键出现在下一个和插入顺序。
  • 这个顺序是由Object.keys(obj)
  • Firefox中的for (var key in obj) {...}所报告的顺序可能有所不同

该函数返回一个按字母顺序插入sorting键的对象:

 function orderKeys(obj, expected) { var keys = Object.keys(obj).sort(function keyOrder(k1, k2) { if (k1 < k2) return -1; else if (k1 > k2) return +1; else return 0; }); var i, after = {}; for (i = 0; i < keys.length; i++) { after[keys[i]] = obj[keys[i]]; delete obj[keys[i]]; } for (i = 0; i < keys.length; i++) { obj[keys[i]] = after[keys[i]]; } return obj; } 

这是一个快速testing:

 var example = { "3": "charlie", "p:style": "c", "berries": "e", "p:nvSpPr": "a", "p:txBody": "d", "apples": "e", "5": "eagle", "p:spPr": "b" } var obj = orderKeys(example); 

这返回

 { '3': 'charlie', '5': 'eagle', apples: 'e', berries: 'e', 'p:nvSpPr': 'a', 'p:spPr': 'b', 'p:style': 'c', 'p:txBody': 'd' } 

然后你可以得到有序的键为:

 Object.keys(obj) 

哪个返回

 ["3", "5", "apples", "berries", "p:nvSpPr", "p:spPr", "p:style", "p:txBody"] 

如果转换为一个数组不适合你的模板,你知道你的对象的键,你也可以做这样的事情:

在您的控制器中按照正确的顺序定义一个数组:

 this.displayOrder = [ 'firstKey', 'secondKey', 'thirdKey' ]; 

在你的模板中重复你的displayOrder的键,然后使用ng-init引用回你的对象。

 <div ng-repeat="key in ctrl.displayOrder" ng-init="entry = ctrl.object[key]"> {{ entry.detail }} </div>