Сортировка многомерного массива с помощью Javascript: целые числа - PullRequest
0 голосов
/ 09 февраля 2011

У меня есть двумерный массив, который называется «результаты». Каждый массив строк в результатах содержит как строковые, так и целочисленные значения. Я использую этот скрипт для сортировки массива по любому «столбцу» события onclick:

function sort_array(results, column, direction) {
var sorted_results = results.sort(value);
function value(a,b) {
    a = a[column];
    b = b[column];
    return a == b ? 0 : (a < b ? -1*direction : 1*direction)
    }
}

Это прекрасно работает для столбцов со строками. Но он обрабатывает столбцы целых чисел как строки вместо чисел. Например, значения 15, 1000, 200, 97 будут отсортированы по 1000, 15, 200, 97 в случае «возрастания» или 97, 200, 15, 1000 «по убыванию».

Я дважды проверил typeof целочисленные значения, и скрипт знает, что они числа. Как я могу заставить его относиться к ним как таковой?

Ответы [ 5 ]

1 голос
/ 09 февраля 2011

Сделайте типы a и b частью сравнения, которое решает, что возвращает ваша функция value.В процессе вы должны решить, как сортировать целые числа относительно строк.

В качестве альтернативы вы можете использовать функцию сравнения, которая принимает значения и выполняет подстановку, чтобы заменить каждую строку цифр на строку цифрфиксированной длины, с ведущими нулями, а затем выполняет сравнение строк.Преимущество этого подхода заключается в том, что вы сортируете такие вещи, как «a2», «a9», «a10» и т. Д. Что обычно нравится людям.

0 голосов
/ 09 февраля 2011

Во-первых: сортировка является мутатором, что означает, что сортировка происходит на месте. Поэтому, чтобы избежать непреднамеренных последствий, я бы изменил

var sorted_results = results.sort(value);

до

var sorted_results = results.slice(0).sort(value);

Если, конечно, вы не хотите, чтобы он сортировался на месте, но тогда зачем вам нужна переменная sorted_results?

Что касается самой сортировки - мне кажется, что целочисленная сортировка работает нормально, проблема в том, что строки в смешанном целочисленном и строковом сценарии, как видно из его примера: http://jsfiddle.net/QJ5fM/,, где сортируется следующие массивы совсем по другому:

[[16],[131],['aa'],['0hey'],[176],[100],['hey'],[1],[12]];
[['aa'],[16],[131],['0hey'],[176],[100],['hey'],[1],[12]];
[['aa'],['0hey'],[16],[131],[176],[100],['hey'],[1],[12]];

дает следующий результат в Chrome 9:

1,12,0hey,aa,hey,16,100,131,176
1,12,0hey,16,100,131,176,aa,hey
1,12,16,100,131,176,0hey,aa,hey

следующее в Firefox 3.6:

1,12,0hey,aa,hey,16,100,131,176
1,12,0hey,hey,16,100,131,176,aa
1,12,hey,16,100,131,176,0hey,aa

и следующее в ie8:

0hey,aa,hey,1,12,16,100,131,176
0hey,aa,hey,1,12,16,100,131,176
0hey,aa,hey,1,12,16,100,131,176

Как это ни удивительно, кажется, что ie8 имеет единственную вменяемую или, по крайней мере, последовательную реализацию: P

0 голосов
/ 09 февраля 2011

Вы можете попытаться создать собственную функцию сравнения, соответствующую вашим потребностям.Вы можете определить свой собственный способ сравнения строк с целыми числами.Например:

function getDirection(a,b){
    if(typeof(a) == typeof(b))
        return a == b ? 0 : (a>b?1:-1);
    a+="";b+="";
    if(a[0] == '-')
        {
            if(b[0] != '-')
                return 1;
        }
    else 
        if(b[0] != '-')
            return -1;
     return a[0] == b[0] ? 0 : (a[0]>b[0]?1:-1);
}

Надеюсь, это поможет.

0 голосов
/ 09 февраля 2011

Я думаю, что перед сортировкой вам нужно будет предварительно пройти значения в столбце.Зачем?Что ж, вам нужно знать заранее (то есть перед сортировкой), можно ли рассматривать все значения как числа.Если они могут, то функция «value» может преобразовать их.В противном случае он должен сортировать их как строки.

0 голосов
/ 09 февраля 2011

Вы уверены, что они числа? Как вы проверяли? Попробуйте эту модификацию, чтобы заставить их быть числами на всякий случай:

if (isNumberColumn(column)) {
    a = +a;
    b = +b;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...