代码之家  ›  专栏  ›  技术社区  ›  nmuntz

按两个标准对多维数组排序?

  •  1
  • nmuntz  · 技术社区  · 14 年前

    我有一个多维数组,我想按两个因素来排序:首先是州,然后是城市。

      var locations = [
                    ['Baltimore', 'Maryland', 'MD'],
                    ['Germantown', 'Maryland', 'MD'],
                    ['Rockville', 'Maryland', 'MD'],
                    ['San Francisco', 'California', 'CA'],
                    ['San Diego', 'California', 'CA']
      ];
    

    先是州,然后是市? 我知道怎么做只是一个因素,而不是两个。。

    5 回复  |  直到 14 年前
        1
  •  2
  •   kennytm    14 年前
    locations.sort(function(x, y) {
       if (x[1] > y[1])       // if you want to sort by abbreviation,
         return 1;            // use [2] instead of [1].
       else if (x[1] < y[1])
         return -1;
       else if (x[0] > y[0])
         return 1;
       else if (x[0] < y[0])
         return -1;
       else
         return 0;
    });
    
        2
  •  1
  •   Ashish Agarwal    14 年前

    你可以使用“ LINQ for JavaS script“库。非常有用的图书馆。

        3
  •  1
  •   Will Vousden    14 年前

    使用自定义排序回调:

    locations.sort(function(a, b)
    {
        if (a[1] < b[1])
        {
            return -1;
        }
        if (a[1] > b[1])
        {
            return 1;
        }
        if (a[0] < b[0])
        {
            return -1;
        }
        if (a[0] > b[0])
        {
            return 1;
        }
    
        return 0;
    });
    
        4
  •  1
  •   Mic    14 年前

    试试这个:

    locations.sort(function(a, b){
      var cmp = function(x, y){ //generic for any sort
         return x > y? -1 : x < y ? 1 : 0; 
      };
      return [cmp(a[1], b[1]), cmp(a[0], b[0])] < 
             [cmp(b[1], a[1]), cmp(b[0], a[0])] ? 1 : -1;
    });
    

    例如,如果你想在城市上降落,你可以使用 -cmp(...) cmp(...)

        5
  •  1
  •   kennebec    14 年前

    如果你有很多城市,你可以用更少的其他条件来实现这一点。

    var locations= [
        ['Baltimore','Maryland','MD'],
        ['Germantown','Maryland','MD'],
        ['Rockville','Maryland ','MD'],
        ['San Francisco','California','CA'],
        ['San Diego','California','CA']
        ];
    
    locations.sort(function(a, b){
        if(a[1]===b[1]){
            if(a[0]===b[0]) return 0;
            return a[0]>b[0]? 1:-1;
        }
        return a[1]>b[1]? 1:-1;
    })
    
    //alert(locations.join('\n'))
    locations.join('\n')
    
    /*  returned value: (String)
    San Diego,California,CA
    San Francisco,California,CA
    Baltimore,Maryland,MD
    Germantown,Maryland,MD
    Rockville,Maryland ,MD
    */