通过属性名称sortingJavaScript对象
我一直在寻找一段时间,想要一种方法来sorting一个JavaScript对象,如下所示:
{ method: 'artist.getInfo', artist: 'Green Day', format: 'json', api_key: 'fa3af76b9396d0091c9c41ebe3c63716' }
并按名称按字母顺序sorting以得到:
{ api_key: 'fa3af76b9396d0091c9c41ebe3c63716', artist: 'Green Day', format: 'json', method: 'artist.getInfo' }
我找不到任何代码可以做到这一点。 任何人都可以给我一些帮助吗?
根据定义, 对象中的键的顺序是不确定的 ,所以你可能无法做到这一点,以一种未来的方式。 相反,当对象实际显示给用户时,应该考虑对这些键进行sorting。 无论它在内部使用什么sorting顺序都无关紧要。
按照惯例,大多数浏览器将按照添加的顺序保留对象的顺序。 所以,你可以做到这一点,但不要指望它总是工作:
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; }
这个函数接受一个对象,并返回一个有序的数组,其forms为[key,value]
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; }
对象数据结构没有明确定义的顺序。 用math术语来说,一个对象中的键的集合是一个无序集合,应该这样对待。 如果你想定义顺序,你应该使用一个数组,因为具有顺序的数组是一个你可以依赖的假设。 具有某种顺序的对象是执行的奇想所留下的东西。
当需要比较或散列结果时,只需使用已sorting的stringify() 。
// 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}})