有没有办法对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>