【问题标题】:Sorting a Multidimensional Array by Text按文本对多维数组进行排序
【发布时间】:2013-12-14 20:21:10
【问题描述】:

我正在尝试在 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 处是文本。

我试图查找将日期或文本更改为数字,然后根据它的数值对其进行评估,但我无法找到这样做的方法(我也不知道这是否是最好的方法接近这个)。有什么建议吗?

【问题讨论】:

  • 按文本排序将按字母顺序排序,您传递的比较器函数看起来与您用于数字的函数完全一样。您实际上要对哪个值进行排序?您可以发布您尝试过的代码吗?
  • 我正在尝试按标题数组的第二个值排序,因此它应该对值“Chris”、“Zoe”和“Petey”进行排序。块排序代码是我尝试排序的代码。它适用于数字(如标题数组中的第三个值),但不适用于文本。

标签: javascript sorting date text multidimensional-array


【解决方案1】:

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

> 运算符可用于您的目的。比较字符串时,如果字符串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};
        }
    )

【讨论】:

    【解决方案2】:

    试试这样的:

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

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

    【讨论】:

      猜你喜欢
      • 2011-03-15
      • 1970-01-01
      • 1970-01-01
      • 2015-06-28
      • 2016-10-31
      • 2012-06-15
      • 2015-08-27
      相关资源
      最近更新 更多