2016-01-24 4 views
2

Сортировка многомерного массива в JavaScript. Перспективы других сообщений, но не могут понять, как передать члены массива в пользовательскую функцию сортировки, которая определяет, нужно ли сортировать строку или числа. Пользовательская функция сортировки заключается в следующем:Сортировка многомерного массива в JavaScript с использованием пользовательской функции сортировки

function colSort(a, b) { 
    if (sortDown) dValue = 1 
    else dValue = -1; 

    if (isNumeric(a[sortIndex])) { 
     return (b[sortIndex] - a[sortIndex]) * dValue; 
    } else { 
     var astring = a[sortIndex].toLowerCase(); 
     var bstring = b[sortIndex].toLowerCase(); 
     if (bstring > astring) return -dValue; 
     if (bstring < astring) return dValue; 
     return 0; 
    } 
} 

массив выглядит следующим образом:

var qbStats =[ 

    ['David Lea', 'GB', 343, 502, 68.3, 4643, 9.2, 45, 6, 122.5], 

    ['Kevin Whyte', 'NO', 440, 622, 70.7, 5087, 8.2, 41, 13, 108.4] 

] 

Заголовки столбцов в HTML-таблицу с перечислением членов массива должен быть в состоянии нажать, чтобы сортировать по возрастанию/по убыванию на клике колонка.

Я не могу понять, как указать участников, которые будут отсортированы по индексу с щелчком.

Я знаю, что начинается как:

qbStats.sort(colSort(a,b)); 

Но я не знаю, как передать члены массива должны быть отсортированы по заданному индексу. Пример: Как мне рассказать сортировать по 'GB' и 'NO' как 'a' и 'b'? Спасибо за любую помощь, которую вы можете дать!

+0

Это не ясно, как именно вы хотите массив (ы) для сортировки. Можете ли вы привести пример с тремя или четырьмя рядами и объяснить, как их следует заказать и почему? – Pointy

+0

Подождите - я думаю, что понял. Вы хотите упорядочить весь список по значению одного столбца. ОК. – Pointy

ответ

1

Функция обратного вызова функции sort() вызывается процессом сортировки и передается парам элементов массива. Вам не нужно рассказывать, какие элементы сравнивать; процесс сортировки уже знает об этом.

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

function byColumn(sortIndex) { 
    return function colSort(a, b) { 
    if (sortDown) dValue = 1 
    else dValue = -1; 

    if (isNumeric(a[sortIndex])) { 
     return (b[sortIndex] - a[sortIndex]) * dValue; 
    } else { 
     var astring = a[sortIndex].toLowerCase(); 
     var bstring = b[sortIndex].toLowerCase(); 
     if (bstring > astring) return -dValue; 
     if (bstring < astring) return dValue; 
     return 0; 
    } 
    }; 
} 

И потом:

qbStats.sort(byColumn(4)); // sort by column 4 

byColumn() функция только простой упаковщик вокруг вашей функции компаратора. Когда он вызывается, он возвращает фактическую функцию, которую будет использовать процесс сортировки. Эта функция имеет доступ к параметру sortIndex, который был передан во время его создания, поэтому он по сути «знает», как сравнивать две строки.

+0

Я думаю, что это может быть немного ближе к тому, что мне нужно, но откуда взялись «а» и «б»? Разве это не первые элементы массива измерений? Как тогда colSort знает индекс для сортировки? Предполагается ли сценарий «знать», что такое a и b? – user1560289

+0

Параметры «a» и «b» поступают из механизма сортировки. Сорт должен сравнивать пары значений из массива, и поэтому для этого он вызывает вашу функцию компаратора с двумя значениями. Вам не нужно беспокоиться о том, какие два значения они есть; ему просто нужно ответить ответом, на который нужно идти первым. – Pointy

+0

Я думаю, что я начинаю это получать. То, что я сделал, это просто использовать array.sort (colSort) ;, и он сделал то, что вы сказали, «знал», чтобы вытащить значения a и b, поскольку команда sort() повторяется через каждый набор сравниваемых элементов. Я делал это сложнее, чем нужно, но ваш ответ помог мне увидеть решение. – user1560289

0

Возможно, это что-то для вас. Функция возвращает для любого случая правую функцию для сравнения.

var qbStats = [['David Lea', 'GB', 343, 502, 68.3, 4643, 9.2, 45, 6, 122.5], ['Kevin Whyte', 'NO', 440, 622, 70.7, 5087, 8.2, 41, 13, 108.4]]; 
 

 
function sort(column, sortOrder, isNumber) { 
 
    if (isNumber) { 
 
     if (~sortOrder) { 
 
      return function (a, b) { 
 
       return a[column] - b[column]; 
 
      } 
 
     } else { 
 
      return function (a, b) { 
 
       return b[column] - a[column]; 
 
      } 
 
     } 
 
    } else { 
 
     if (~sortOrder) { 
 
      return function (a, b) { 
 
       return a[column].localeCompare(b[column]); 
 
      } 
 
     } else { 
 
      return function (a, b) { 
 
       return b[column].localeCompare(a[column]); 
 
      } 
 
     } 
 
    } 
 
} 
 

 
qbStats.sort(sort(0, 1, false)); // sort 0th column, ascending by string 
 
document.write('<pre>' + JSON.stringify(qbStats, 0, 4) + '</pre>'); 
 

 
qbStats.sort(sort(2, -1, true)); // sort 2th column, descending by number 
 
document.write('<pre>' + JSON.stringify(qbStats, 0, 4) + '</pre>');

+0

Я ценю ваш ответ, но я все еще немного потерян. Функция сортировки приведет к динамической сортировке любого из нескольких массивов, поэтому массивы должны быть переданы функции сортировки динамически, а индекс, по которому нужно сортировать, также должен быть передан динамически. Я также должен использовать функцию colSort(), как описано выше. – user1560289

Смежные вопросы