JS `array.sort` не работает в IE6, потому что сравниваемые значения не являются числами.Как решить? - PullRequest
1 голос
/ 05 сентября 2011

У меня есть следующая функция сортировки, которая пытается сортировать элементы на основе того, начинаются ли они со значения, введенного в текстовое поле.

items.sort(function(a, b) {
    var aStart = a.name.match(new RegExp('^' + textEntered, 'i')) || [];
    var bStart = b.name.match(new RegExp('^' + textEntered, 'i')) || [];

    if (aStart.length != bStart.length) {
        return bStart.length - aStart.length;
    }
    else {
        return b.name - a.name; // error because these aren't numbers
    }

    return 0;
});

Это работает во всех браузерах, в которых я его пробовал, за исключением IE6, который возвращает ошибку о том, что он ожидал число.

Я попытался реализовать предлагаемое исправление из этой статьи, в котором предлагается «Не повторно использовать переменные аргумента внутри функции сортировки по массиву».

items.sort(function(a1, b1) {

    var a, b;
    a = a1;
    b = b1;

    var aStart = a.name.match(new RegExp('^' + textEntered, 'i')) || [];
    var bStart = b.name.match(new RegExp('^' + textEntered, 'i')) || [];

    if (aStart.length != bStart.length) {
        return bStart.length - aStart.length;
    }
    else {
        return b.name - a.name;
    }

    return 0;
});

но это не имеет никакого эффекта. Кто-нибудь имел дело с этим раньше? Как лучше всего решить эту проблему?

1 Ответ

1 голос
/ 05 сентября 2011

Если вы хотите сравнить строки и хотите вернуть -1, 0 или 1, используйте localeCompare().

return a.name.localeCompare(b.name);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...