Sorting a JavaScript object by property name
我已经找了一段时间了,想找一种方法来对javascript对象进行如下排序:
1 2 3 4 5 6 | { method: 'artist.getInfo', artist: 'Green Day', format: 'json', api_key: 'fa3af76b9396d0091c9c41ebe3c63716' } |
排序按名称的字母顺序得到:
1 2 3 4 5 6 | { api_key: 'fa3af76b9396d0091c9c41ebe3c63716', artist: 'Green Day', format: 'json', method: 'artist.getInfo' } |
我找不到任何能做到这一点的代码。有人能帮我吗?
根据定义,对象中键的顺序是未定义的,因此您可能无法以一种将来可以证明的方式执行该操作。相反,当对象实际显示给用户时,您应该考虑对这些键进行排序。不管它在内部使用什么样的排序顺序,都不重要。
按照惯例,大多数浏览器将按照添加键的顺序保留对象中键的顺序。所以,你可以这样做,但不要期望它总是有效的:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | function sortObject(o) { var sorted = {}, key, a = []; for (key in o) { if (o.hasOwnProperty(key)) { a.push(key); } } a.sort(); for (key = 0; key < a.length; key++) { sorted[a[key]] = o[a[key]]; } return sorted; } |
此函数接受一个对象并返回一个已排序的数组形式[键,值]
1 2 3 4 5 6 7 8 9 10 | function (o) { var a = [],i; for(i in o){ if(o.hasOwnProperty(i)){ a.push([i,o[i]]); } } a.sort(function(a,b){ return a[0]>b[0]?1:-1; }) return a; } |
对象数据结构没有定义好的顺序。在数学术语中,对象中的键集合是一个无序集,应该这样处理。如果要定义顺序,则应使用数组,因为具有顺序的数组是可以依赖的假设。具有某种顺序的对象是由实现的突发奇想决定的。
当需要比较或散列结果时,只需使用sorted stringify()。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | // if ya need old browser support Object.keys = Object.keys || function(o) { var result = []; for(var name in o) { if (o.hasOwnProperty(name)) result.push(name); } return result; }; var o = {c: 3, a: 1, b: 2}; var n = sortem(o); function sortem(old){ var newo = {}; Object.keys(old).sort().forEach(function(k) {new[k]=old[k]}); return newo; } // deep function sortem(old){ var newo = {}; Object.keys(old).sort().forEach(function(k){ newo[k]=sortem(old[k]) }); return newo; } sortem({b:{b:1,a:2},a:{b:1,a:2}}) |
这应该谨慎使用,因为您的代码不应该依赖于对象属性顺序。如果只是一个陈述的问题(或者只是为了好玩!),可以这样对属性进行深度排序:
1 2 3 4 5 6 7 8 9 10 11 | function sortObject(src) { var out; if (typeof src === 'object' && Object.keys(src).length > 0) { out = {}; Object.keys(src).sort().forEach(function (key) { out[key] = sortObject(src[key]); }); return out; } return src; } |