2010-11-09 91 views
1

我有一個多維數組,我想按兩個因素排序:首先是狀態,然後是按字母順序排列的城市。按兩個標準對多維數組進行排序?

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

如何根據這兩個因素按字母順序對它們進行排序? 第一個州,然後城市? 我知道怎麼做只是一個因素,但不是兩個。

回答

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

非常好!正是我需要的。非常感謝你! – nmuntz 2010-11-09 17:40:14

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

@Felix:看我的編輯:) – 2010-11-09 17:39:30

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

如果你想SOR的城市降比如,你可以使用-cmp(...)代替cmp(...)

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