2013-11-28 66 views
0

我想在Javascript中对多维数组进行排序。我看到很多关于如何按数字值排序的解释,但我似乎无法弄清楚如何通过文本对其进行排序。通过文本排序多维数组

,我要排序看起来像这样的数组:

var blocks = [ 
    { 
     "heading": ["2013-10-1", "Chris", "11"], 
     "content": "stuff 1" 
    }, 
    { 
     "heading": ["2013-10-3", "Zoe", "14"], 
     "content": "stuff 2" 
    }, 
    { 
     "heading": ["2013-10-2", "Petey", "12"], 
     "content": "stuff 3" 
    } 
] 

我知道我可以说是数字值进行排序的对象,像这样这个多维数组:

blocks.sort(
    function(a,b){ 
     return a.heading[2] - b.heading[2]; 
     } 
    ) 

我不知道我传入排序方法的函数看起来像是如果我想按heading子数组中的第一个或第二个值排序数组,因为索引0处的值是日期,索引1处的值是文本。

我试图查看更改日期或文本到一个数字,然后评估它的数值,但我无法找到一种方法(我也不知道这是否是最好的方法接近这个)。有什么建议么?

+0

按文字排序将按字母顺序排序,您传递的比较函数看起来与您用于数字的函数完全一样。你真的想要分类哪个值?你能发布你试过的代码吗? –

+0

我想按标题数组的第二个值排序,所以它应该排序值“Chris”,“Zoe”和“Petey”。块排序代码是我尝试进行排序的代码。它的确适用于数字(如标题数组中的第三个值),而不适用于文本。 –

回答

2

[编辑]我应该指出,尽管我提出的初始解决方案是有效的,但它不是一个好的解决方案,因为它不必要的复杂。

>运营商可用于您的目的。比较字符串时,字符串a被认为小于字符串b,如果字符串a在按字母排序的列表中的b之前。

唯一的问题是这是区分大小写的,所以大写字母在小写字母之前出现,例如,排序字符AaBbCc会给你ABCabc。

这意味着,你可以这样做:

blocks = blocks.sort(function(a,b) { return a.heading[1] > b.heading[1] } 

以前的答案:

有人也许能够提供更完美的解决方案,但是这会奏效。

请注意,sort()按字母顺序排序。所以我们需要做的就是使sort()函数对人员名称起作用。

blocks = blocks.sort(
    function(a,b){ 

     var x = [a.heading[1], b.heading[1]].sort() 

     if (x[0] == a.heading[1]) {return -1} else 
     {return 1}; 
     } 
    ) 
1

尝试这样:

blocks.sort(function(a, b){ 
    if(a.heading[0] < b.heading[0]) return -1; 
    if(a.heading[0] > a.heading[0]) return 1; 
    return 0; 
}); 

或者只是通过简化上面的代码:

blocks.sort(function(a, b){ 
    if(a.heading[0] < b.heading[0]) { 
     return -1; 
    } else { 
     return 1; 
    } 
    return 0; 
}); 

您也可以使用以下方法:

blocks.sort(function(a, b){ 
    var heading_a = a.heading.toLowerCase(); 
    var heading_a=b.heading.toLowerCase(); 

    if (heading_a < heading_a) //sort ascending 
     return -1 
    if (heading_a > heading_a) 
     return 1 
    return 0 //just return default value indicating there is no sort 
}); 

如果您的数据包含Unicode字符串,那么你应该使用上面的代码是这样的:

blocks.sort(function(a, b){ 
    var heading_a = a.heading[0].toLowerCase(); 
    var heading_a=b.heading[0].toLowerCase(); 

    return heading_a.localeCompare(heading_b); 
}); 

这只是一个排序的高峰,它只是一个简单的例子,我希望它有帮助。