2011-12-07 97 views
7

我有一个基于存储在表中的数据生成的JSON对象。然后我需要能够以不同的方式对其进行排序,但是当我执行JSON.stringify(array)并尝试从那里排序时,它不起作用。当我试图做array.sort();它会改变顺序,但最终不起作用。我对JSON没有多少经验,以及如何操作它,所以我不知道还有什么可以尝试的。排序后,我需要按照字母顺序重新编写所选类别的表格。按字母顺序排序JSON

的JSON看起来是这样的:

var arr = [{ 
"Functional Category":"T-Shirt", 
"Brand Name":"threadless", 
"When Obtained":"Last 3 Months", 
"How Obtained":"Purchased", 
"How Often Worn":"Monthly", 
"Where It's Made":"India", 
"Has a Graphic":"Yes"}] 

我在这里有一个小提琴设置:http://jsfiddle.net/Skooljester/88HVZ/1/,我已经试过什么建议here,但无法使其工作。

我有两个问题,一个:我该如何去完成这个任务,还有两个问题:有没有更好的方法来完成排序?

+4

下一次请在问题中包含相关代码。如果jsFiddle宕机(有时会这样),你的问题是不完整的。 –

回答

6

首先,定义一个比较功能:

function compare(el1, el2, index) { 
    return el1[index] == el2[index] ? 0 : (el1[index] < el2[index] ? -1 : 1); 
} 

然后,在第一列的数组进行排序,使用此:

array.sort(function(el1,el2){ 
    return compare(el1, el2, "Functional Category") 
}); 

或者,如果要排序的第一列AZ,和如果第一列相同,则在第二列ZA上:

array.sort(function(el1,el2){ 
    var compared = compare(el1, el2, "Functional Category") 
    return compared == 0 ? -compare(el1, el2, "Brand Name") : compared; 
}); 
+0

这很好用。我遇到了让它打印的问题,但解决了这个问题。看到这里:http://jsfiddle.net/Skooljester/agcUk/3/非常感谢! –

+1

是的,我用你以前的jsfiddle来测试它,参见http://jsfiddle.net/88HVZ/7/ – Bart

5

Mozilla开发人员文档对排序功能有帮助。您可以提供一个函数作为参数,告诉浏览器如何进行排序。

https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/sort

一些伪代码链接,与myArray.sort通话,并将该功能的名称中删除:

myArray.sort(function(a, b) { 
    if (a is less than b by some ordering criterion) 
    return -1; 
    if (a is greater than b by the ordering criterion) 
    return 1; 
    // a must be equal to b 
    return 0; 
}); 

编辑:它看起来像你有一个单元素数组一个对象作为元素。对象是无序的。在对它进行排序之前,您必须将其转换为数组。试试这个(与Object.keys和Array.prototype.map功能通过augment.js增加了对旧的浏览器):

var result = Object.keys(myArray[0]).sort().map(function(key) { 
    return [key,myArray[0][key]]; 
}); 

这会给你的表格的排序,嵌套的数组:

[["Brand Name","threadless"], 
["Function Category","T-Shirt"], 
... 
] 
+0

我看了看,但无法弄清楚如何实现它。 –

2

这种东西可能是在帮助:

 
function (obj) { 
    var a = [],x; 
    for(x in obj){ 
    if(obj.hasOwnProperty(x)){ 
     a.push([x,obj[x]]); 
    } 
    } 
    a.sort(function(a,b){ return a[0]>b[0]?1:-1; }) 
    return a; 
} 

6

看到下面的代码....

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

请原谅我的缺乏经验,但在尝试实施代码时,它并没有像预期的那样工作http://jsfiddle.net/Skooljester/WtDTD/1/ –

+1

这将在V8上打破数字键:http:// code.google.com/p/v8/issues/detail?id=164 –

+0

@MANISH LANGA,+1非常棒的功能!在我看来,这将是正确的答案。 :-) –

1

如果您的意图是允许用户动态地对表格排序,那么我的方法可能会稍有不同。

有很多jQuery表格排序插件。我曾与这一个很好的成功:http://tablesorter.com/docs/

允许多列排序,默认的排序,线材达事件,等...等...

这样你就可以建立自己的表,你已经是,并且可以在页面输出之前进行二次排序。

+0

这是正确的意图。但是,由于我仍然在学习JavaScript/jQuery,我正在尝试在不使用插件的情况下进行排序。 –