2009-08-31 169 views
49

我一直在找了一会儿,想办法进行排序JavaScript对象是这样的:按属性名称排序JavaScript对象

{ 
    method: 'artist.getInfo', 
    artist: 'Green Day', 
    format: 'json', 
    api_key: 'fa3af76b9396d0091c9c41ebe3c63716' 
} 

和排序是按名称字母来获得:

{ 
    api_key: 'fa3af76b9396d0091c9c41ebe3c63716', 
    artist: 'Green Day', 
    format: 'json', 
    method: 'artist.getInfo' 
} 

我找不到任何代码可以做到这一点。任何人都可以给我一些帮助吗?

+0

http://www.javascriptkit.com/javatutors/arraysort.shtml - 有关排序复杂JS对象的体面教程。 http://www.highdots.com/forums/javascript/re-sorting-json-data-270187.html - 另一个例子--- 如果您需要详细信息,请参阅sort函数的完整参考https:/ /developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Objects/Array/sort -Last edit,我发誓! – 2009-08-31 23:02:04

+0

我得到的问题是这些文章展示了如何对对象数组进行排序。我正在尝试对填充了对象的对象进行排序。请问同样的例子适用于我的案例,如果可以的话,你能提供一个例子吗? 对不起,我只是真的卡在这一个:s – matto1990 2009-08-31 23:09:59

+5

这是一个古老的问题,但我是一个学生,所以第十亿次:没有这样的东西作为JSON对象 - 至少,不在你指的是它的方式。有javascript对象和JSON字符串。 – 2012-12-12 18:29:02

回答

73

根据定义,order of keys in an object is undefined,所以你可能无法做到这一点的方式是未来的证明。相反,当对象实际显示给用户时,应该考虑对这些键进行排序。无论它在内部使用什么排序顺序都无关紧要。

按照惯例,大多数浏览器会按照添加顺序保留对象的顺序。所以,你可以这样做,但不要指望它始终工作:

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; 
} 
+0

这似乎很好地工作。我将不得不在未来的浏览器中关注它,但它现在似乎仍然有效。 感谢您的帮助:) – matto1990 2009-08-31 23:14:49

+0

它实际上可能始终有效,它正在被编入Ecmascript标准中,但它依然不是一个安全的假设,因为具有已定义的顺序在逻辑上不是“对象”的一部分”。如果你想定义顺序,你应该使用一个数组。 – Breton 2009-08-31 23:33:43

+0

我需要这样做的唯一原因是对值进行一次排序,以便我可以生成第6部分中此页面上定义的api签名:http://www.last.fm/api/webauth 如果我正在使用它比我更多地使用数组,然后他们排序。 – matto1990 2009-08-31 23:37:42

12

此功能需要一个对象,并返回形式排列的有序数组[键,值]

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; 
} 

对象数据结构没有明确定义的顺序。用数学术语来说,对象中的键的集合是一个无序集合,应该这样对待。 如果你想定义顺序,你应该使用一个数组,因为具有顺序的数组是一个你可以依赖的假设。具有某种顺序的对象是由实现的奇思妙想留下的东西。

3
// 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}}) 
+0

非常好,很流畅,但不幸的是,Object.keys()在IE <9中不受支持,并且在任何IE> = 9的Quirks模式下都不支持。请参阅[MSDN的IE开发人员中心](http://msdn.microsoft.com/en-us/library/ie/ff688127(v = vs.94).aspx)。 – Jpsy 2013-10-28 11:29:10

+0

在上面的答案中添加了poly填充 – 2014-03-09 15:27:54

+0

如果您的意思是深度排列的obj,我编辑了上面的答案。 '新'是一个错字。 – 2014-03-09 15:54:15