Javascript JS是否支持使用键函数而不是比较器进行排序?

Javascript JS是否支持使用键函数而不是比较器进行排序?,javascript,sorting,Javascript,Sorting,JavaScript的方法采用可选的比较函数作为参数,该函数采用两个参数,并决定哪一个参数比另一个小 但是,有时使用键函数自定义排序顺序会更方便,键函数将一个值作为参数并为其指定排序键。例如: function keyFunc(value){ return Math.abs(value); } myArr = [1, 3, -2]; myArr.sort(keyFunc); // the result should be [1, -2, 3] JavaScript是否支持这一点,还是

JavaScript的方法采用可选的比较函数作为参数,该函数采用两个参数,并决定哪一个参数比另一个小

但是,有时使用键函数自定义排序顺序会更方便,键函数将一个值作为参数并为其指定排序键。例如:

function keyFunc(value){
    return Math.abs(value);
}

myArr = [1, 3, -2];
myArr.sort(keyFunc);
// the result should be [1, -2, 3]
JavaScript是否支持这一点,还是没有办法编写一个完整的比较函数?

不支持您所描述的内容,但是编写一个实现相同功能的标准
.sort
函数非常简单,使用最小代码-只需将两个参数调用
keyFunc
之间的差异返回到
sort

 {
   const { sort } = Array.prototype;
   Array.prototype.sort = function(sorter) {
    if(sorter.length === 2) {
      sort.call(this, sorter);
    } else {
       sort.call(this, (a, b) => sorter(a) - sorter(b));
    }
  };
}
函数keyFunc(值){
//如果需要,这里有复杂的自定义逻辑
返回Math.abs(值);
}
myArr=[1,3,-2];
myArr.sort((a,b)=>keyFunc(a)-keyFunc(b));
console.log(myArr);

//结果应该是[1,-2,3]
您可以轻松地从两个元素中减去“键”:

 myArr.sort((a, b) => keyFunc(a) - keyFunc(b));
您也可以使用monkey patch
排序

 {
   const { sort } = Array.prototype;
   Array.prototype.sort = function(sorter) {
    if(sorter.length === 2) {
      sort.call(this, sorter);
    } else {
       sort.call(this, (a, b) => sorter(a) - sorter(b));
    }
  };
}
那么:

 myArr.sort(keyFunc);

有效。

您可以在想要的函数上使用闭包

const
keyFunc=value=>Math.abs(值),
sortBy=fn=>(a,b)=>fn(a)-fn(b),
数组=[1,3,-2];
sort(sortBy(keyFunc));

console.log(数组);//[1,-2,3]
如前所述,您必须自己编写该功能,或扩展当前数组
排序方法等

另一种方法是使用
lodash
及其方法。。。这就变成了:

myArr=[1,3,-2];
const result=\ u0.orderBy(myArr,Math.abs)
console.log(结果)

我有点超出了问题的范围,但在我的特定用例中,执行关键函数的成本相当高。这就是为什么我不想为需要比较的每对值调用它两次。您是否可以扩展您的答案以涵盖该用例,或者我是否应该发布一个关于使用昂贵的比较函数进行排序的新问题?@aran fey我认为这将是一个新问题。。。这对对象不起作用,我宁愿在这里使用
映射
。我不太使用JS,所以我不确定那里的常见做法,但是猴子补丁
数组。排序
似乎有点。。。丑陋,也有风险。这不会破坏任何东西吗。。。?