如何将其他参数传递给sort函数

时间:2015-08-24 14:07:17

标签: javascript arrays sorting

我有一个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功能的secondaryColsortBy个参数。我想要做的是在compareNumber之外移动sortBy函数。在这种情况下,代码将无效,因为compareNumber无法访问primaryColsecondaryCol。将primaryColsecondaryCol传递给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);

那么,有没有办法让这项工作成功,将其他参数传递给除ab以外的排序函数?

2 个答案:

答案 0 :(得分:1)

添加额外的参数然后换行或feature request比较器在每次调用时传入这些参数

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。< / p>

答案 1 :(得分: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]