代码之家  ›  专栏  ›  技术社区  ›  Aran-Fey Kevin

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

  •  2
  • Aran-Fey Kevin  · 技术社区  · 6 年前

    JavaScript的 array.sort

    但是,有时使用 关键功能 ,这是一个 值作为参数,并为其赋值 排序键

    function keyFunc(value){
        return Math.abs(value);
    }
    
    myArr = [1, 3, -2];
    myArr.sort(keyFunc);
    // the result should be [1, -2, 3]
    

    JavaScript是否支持这一点,或者没有办法编写一个完整的比较函数?

    4 回复  |  直到 6 年前
        1
  •  4
  •   CertainPerformance    6 年前

    没有人支持你 确切地 你所描述的,但是写一个标准是很琐碎的 .sort 差异 通话间隙 keyFunc sort :

    function keyFunc(value){
        // complicated custom logic here, if desired
        return Math.abs(value);
    }
    
    myArr = [1, 3, -2];
    myArr.sort((a, b) => keyFunc(a) - keyFunc(b));
    console.log(myArr);
    // the result should be [1, -2, 3]

    如果键函数很复杂,并且您不想运行它,那么为每个输入创建一个查找表就相当简单了,如果 以前使用该值调用过:

    const keyValues = new Map();
    function keyFunc(value){
        const previous = keyValues.get(value);
        if (previous !== undefined) return previous
        console.log('running expensive operations for ' + value);
        // complicated custom logic here, if desired
        const result = Math.abs(value);
        keyValues.set(value, result);
        return result;
    }
    
    myArr = [1, 3, -2];
    myArr.sort((a, b) => keyFunc(a) - keyFunc(b));
    console.log(myArr);
    // the result should be [1, -2, 3]
        2
  •  1
  •   Akrion    6 年前

    sort 方法等。

    另一种方法是使用 lodash orderBy 方法。。。然后变成:

    myArr=[1, 3, -2];
    
    const result = _.orderBy(myArr, Math.abs)
    
    console.log(result)
    <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>
        3
  •  0
  •   Nina Scholz    6 年前

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

    const
        keyFunc = value => Math.abs(value),
        sortBy = fn => (a, b) => fn(a) - fn(b),
        array = [1, 3, -2];
    
    array.sort(sortBy(keyFunc));
    console.log(array); // [1, -2, 3]
        4
  •  0
  •   Jonas Wilms    6 年前

     myArr.sort((a, b) => keyFunc(a) - keyFunc(b));
    

    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));
        }
      };
    }
    

     myArr.sort(keyFunc);
    

    作品。