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

时间:2010-11-09 17:27:22

标签: javascript sorting

我有一个多维数组,我想按两个因素排序:首先是状态,然后是按字母顺序排列的城市。

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

如何根据这两个因素按字母顺序对它们进行排序? 第一州,然后是城市? 我知道怎么做只是一个因素,而不是两个..

5 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

您可以使用“LINQ for JavaS cript”库。非常有用的库。

答案 2 :(得分:1)

使用自定义排序回调:

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

答案 3 :(得分:1)

试试这个:

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(...)

答案 4 :(得分:1)

你可以用更少的其他ifs来做到这一点 - 如果你有很多城市可能会有所作为。

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
*/