Вход

Просмотр полной версии : вопрос по методу sort


simple
11.04.2013, 22:49
Скажите пожалуйста, можно ли как нибудь в функцию которую вызывает метод sort передать доп.аргументы? Например есть двумерный массив 10х10, мне нужну иметь сортировку по каждой колонке, неужели придется для каждой прописывать свою функцию?

function (a, b) {
return a[n] - b[n];
};

Как можно передать в функцию аргумент n?

Akalenik
11.04.2013, 23:14
Двумерный массив 10х10 - это обычный массив из 10 обычных массивов из 10 элементов. Переворачиваем массив (строки в колонки) - сортируем - переворачиваем обратно. Профит.

dastingo
11.04.2013, 23:15
может попробовать сортировать в цикле

var arr = [
[7, 6, 5],
[17, 16, 15],
];

var arrSorted = [];
for ( var i=0; i<arr.length; i++ ) {
arrSorted.push( arr[i].sort( compNums ) );
}

console.log( arrSorted );

function compNums( a, b ) {
return a - b;
}

simple
11.04.2013, 23:23
может попробовать сортировать в цикле
Нет, в цикле не пойдет, тем более мне нужна сортировка по столбцу, а не по строке.

simple
11.04.2013, 23:27
Двумерный массив 10х10 - это обычный массив из 10 обычных массивов из 10 элементов. Переворачиваем массив (строки в колонки) - сортируем - переворачиваем обратно. Профит.
Спасибо, велосипеды я писать умею, мне хотелось узнать можно ли передать как нибудь доп.аргумент в функцию, но похоже никак.

dastingo
11.04.2013, 23:33
тогда никак, compare ф-ия от двух аргументов..

simple
12.04.2013, 00:16
тогда никак, compare ф-ия от двух аргументов..
Почему никак? Можно извернуться через свойства объекта, например так.

function compare (a, b) {
return a[compare.idColumn] - b[compare.idColumn];
};
compare.idColumn = 5; // сортируем по 5-му столбцу
array.sort(compare);

кто предложит решение по лучше?

nikita.mmf
12.04.2013, 00:20
function getComparator ( n ) {
return function ( a, b ) {
return a[ n ] - b[ n ]
}
}
arr.sort( getComparator( 1 ) )

simple
12.04.2013, 00:25
function getComparator ( n ) {
return function ( a, b ) {
return a[ n ] - b[ n ]
}
}
arr.sort( getComparator( 1 ) )

красиво, мне нравится, возьму на вооружение.