2015-08-24 5 views
2

У меня есть 2D-массив, и я использую пользовательскую функцию сортировки для сортировки по столбцу. Моя структура код похож на этот:Как передать дополнительные аргументы для функции сортировки

function sortBy(array, primaryCol, secondaryCol) { 
    function compareNumber(a, b) { 
     if (a[primaryCol] == b[primaryCol]) { 
      return a[secondaryCol] - b[secondaryCol] ? -1 : 1; 
     } 
     return a[primaryCol] - b[primaryCol]; 
    } 
    array.sort(compareNumber); 
} 
sortBy(colors, 3, 0); 

Внутри функции compareNumber я доступ к primaryCol и secondaryCol параметры функции sortBy. Что я хочу сделать, это перемещение compareNumber функция за пределами sortBy. В этом случае код не будет работать, потому что compareNumber не может получить доступ к primaryCol и secondaryCol. Также прохождение primaryCol и secondaryCol в compareNumber Функция не приносит пользы, потому что я предполагаю, что она принимает только два аргумента.

function compareNumber(a, b, primaryCol, secondaryCol) { 
    if (a[primaryCol] == b[primaryCol]) { 
     return a[secondaryCol] < b[secondaryCol] ? -1 : 1; 
    } 
    return a[primaryCol] - b[primaryCol]; 
} 
function sortBy(array, primaryCol, secondaryCol) { 
    array.sort(compareNumber, primaryCol, secondaryCol); 
} 
sortBy(colors, 3, 0); 

Итак, есть ли способ, чтобы сделать эту работу, передать дополнительные аргументы для сортировки функции, кроме a и b?

ответ

1

Вы можете использовать bind передать ему параметры:

function compareNumber(a, b) { 
    if (a[this[0]] == b[this[0]]) { 
     return a[this[0]] < b[this[1]] ? -1 : 1; 
    } 
    return a[this[0]] - b[this[0]]; 
} 
function sortBy(array, primaryCol, secondaryCol) { 
    array.sort(compareNumber.bind([primaryCol, secondaryCol])); 
} 
sortBy(colors, 3, 0); 

Связанный аргумент становится теперь присваивается значение this, так что ваш pirmaryCol в this[0] и ваш вторичный в this[1].

+0

Это, похоже, более применимо к моей проблеме, потому что количество столбцов не будет исправлено. Это будет изменяться. И присваивание массива 'this' кажется более простым. В противном случае мне придется передавать каждый столбец вручную. – akinuri

1

Добавить дополнительный Params затем обернуть или .bind компаратор, чтобы пройти в этих аргументах при каждом вызове

function compareNumber(primaryCol, secondaryCol, a, b) { 
    if (a[primaryCol] == b[primaryCol]) { 
     return a[secondaryCol] - b[secondaryCol] ? -1 : 1; 
    } 
    return a[primaryCol] - b[primaryCol]; 
} 

function sortBy(array, primaryCol, secondaryCol) { 
    array.sort(compareNumber.bind(null, primaryCol, secondaryCol)); 
} 
sortBy(colors, 3, 0); 

Или

// ... 
    array.sort(function (a, b) {return compareNumber(primaryCol, secondaryCol, a, b);}); 
// ... 

Если компаратор использует this, то я бы рекомендовал .bind как есть меньше накладных расходов в одноразовом режиме, чем при необходимости .call или .apply.