【问题标题】:How to pass additional arguments to sort function如何将附加参数传递给排序函数
【发布时间】:2015-08-24 14:07:17
【问题描述】:

我有一个二维数组,我正在使用自定义排序函数按列对其进行排序。我的代码结构是这样的:

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 函数中,我正在访问sortBy 函数的primaryColsecondaryCol 参数。我想要做的是将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 之外,还有什么方法可以让这个工作,将额外的参数传递给排序函数?

【问题讨论】:

    标签: javascript arrays sorting


    【解决方案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] 中。

    【讨论】:

    • 这似乎更适用于我的问题,因为列数不会固定。它会有所不同。将数组分配给this 似乎更容易。否则我将不得不手动传递每一列。
    【解决方案2】:

    添加额外的参数然后包装或.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 要少。

    【讨论】:

      猜你喜欢
      • 2013-11-06
      • 2013-06-03
      • 2016-04-26
      • 1970-01-01
      • 2014-11-27
      • 1970-01-01
      • 2015-03-03
      • 2015-07-19
      • 2020-07-10
      相关资源
      最近更新 更多