массив сортировки javascript - PullRequest
7 голосов
/ 29 марта 2011

Мой массив не сортируется должным образом. Может кто-нибудь сообщить мне, что я делаю не так?

...
 sortArray = new Array ("hello", "Link to Google", "zFile", "aFile");

//sort array
        if (dir == "asc") { 
            sortArray.sort(function(a,b){return a - b}); 
        } else { 
            sortArray.sort(function(a,b){return b - a});
        }

        for(var i=0; i<sortArray.length; i++) { 
            console.log(sortArray[i]);
        }

журнал показывает их в том же порядке, в котором они были введены.

Ответы [ 4 ]

12 голосов
/ 29 марта 2011

Вы хотите сделать сравнение в своем роде, а не вычитание:

if (dir == "asc") {
    sortArray.sort(function(a, b) {
        a = a.toLowerCase();
        b = b.toLowerCase();
        return a === b ? 0 : a > b : 1 : -1;  
    });
} else {
    sortArray.sort(function(a, b) {
        a = a.toLowerCase();
        b = b.toLowerCase();
        return b === a ? 0 : b > a : 1 : -1;  
    });
}

Я также использовал toLowerCase(), чтобы 'Ссылка на Google' была размещена надлежащим образом.

РЕДАКТИРОВАТЬ: Обновлено, чтобы исправить проблему сравнения согласно комментарию.

См. Пример →

7 голосов
/ 29 марта 2011

Проблема в том, что "a - b" обрабатывает строки как числа, что возвращает NaN.Вы получите поведение, которое вы ищете (при условии, что вы ищете сортировки с учетом регистра), если вы замените свои сортировки на:

    if (dir == "asc") { 
        sortArray.sort(function(a,b){return a < b ? -1 : 1}); 
    } else { 
        sortArray.sort(function(a,b){return b < a ? -1 : 1});
    }
7 голосов
/ 29 марта 2011

Вы пытаетесь отсортировать, вычитая строки, к которым вы получите NaN.

6 голосов
/ 29 марта 2011

Функции компаратора возвращают NaN, так как он получает две строки и выполняет вычитание, операция, которая не совсем определена для строк.

То, что вы должны иметь, это что-то вроде:

function(a,b){
   return a>b? 1 : (a<b ? -1 : 0);
}

или вы можете использовать localeCompare:

function(a,b){
   return a.localeCompare(b);
}

Не забудьте относиться к делу надлежащим образом, например, "L" < "a" пока "l" > "a"

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