我有一个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
以外的排序函数?
答案 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]
。