Сортировать многомерный массив по двум критериям? - PullRequest
1 голос
/ 09 ноября 2010

У меня есть многомерный массив, который я хотел бы отсортировать по двум факторам: сначала штат, а затем город в алфавитном порядке.

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

Как я могу отсортировать их по алфавиту на основе этих двух факторов?Сначала штат, потом город?Я знаю, как это сделать, просто один фактор, а не два ..

Ответы [ 5 ]

2 голосов
/ 09 ноября 2010
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 голос
/ 09 ноября 2010

Вы можете сделать это с меньшим количеством 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
*/
1 голос
/ 09 ноября 2010

Попробуйте это:

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

1 голос
/ 09 ноября 2010

Использовать обратный вызов для сортировки:

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;
});
1 голос
/ 09 ноября 2010

Вы можете использовать библиотеку " LINQ для JavaS cript". Очень полезная библиотека.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...