Javascript自定义排序功能

tes*_*dtv 1 javascript jquery

我有一个自定义排序函数定义如下

sortArrayBy: function(a, b, sortKey) {
    if (a[sortKey] < b[sortKey])
        return -1;
    if (a[sortKey] > b[sortKey])
        return 1;
    return 0;
},
Run Code Online (Sandbox Code Playgroud)

如何更新它以根据附加参数isAscending动态排序/切换,该参数可以是true/false

所以函数签名看起来像

sortArrayBy: function(a, b, sortKey, isAscending) {

}
Run Code Online (Sandbox Code Playgroud)

gur*_*372 5

转换isAscending为a 1(用于升序)或-1(用于降序)

sortArrayBy: function(a, b, sortKey, isAscending) {
   return (a[sortKey] - b[sortKey]) * (isAscending ? 1 : -1);
}
Run Code Online (Sandbox Code Playgroud)

演示

function sortArrayBy(arr, sortKey, isAscending) {
  return arr.sort( ( a, b ) => (a[sortKey] - b[sortKey]) * (isAscending ? 1 : -1) );
}

var arr = [
   { a : 1, b: 2 },
   { a : 4, b: 6 },
   { a : 3, b: 4 },
   { a : 12, b: 1 },
   { a : 5, b: 23 },
];

console.log( sortArrayBy( arr, "a", true ) );

console.log( sortArrayBy( arr, "a", false ) );
Run Code Online (Sandbox Code Playgroud)

编辑

包括字符串比较

function sortArrayBy(arr, type, sortKey, isAscending) {
  if ( type == "string" )
  {
     return arr.sort( ( a, b ) => a[sortKey].localeCompare(b[sortKey]) * (isAscending ? 1 : -1) );
  }

  return arr.sort( ( a, b ) => (a[sortKey] - b[sortKey]) * (isAscending ? 1 : -1) );
}
Run Code Online (Sandbox Code Playgroud)

function sortArrayBy(arr, type, sortKey, isAscending) {
  if ( type == "string" )
  {
     return arr.sort( ( a, b ) => a[sortKey].localeCompare(b[sortKey]) * (isAscending ? 1 : -1) );
  }
  
  return arr.sort( ( a, b ) => (a[sortKey] - b[sortKey]) * (isAscending ? 1 : -1) );
}

var arr = [
   { a : 1, b: "32" },
   { a : 4, b: "w6" },
   { a : 3, b: "s4" },
   { a : 12, b: "v1" },
   { a : 5, b: "2s3" },
];

console.log( sortArrayBy( arr, "", "a", true ) );

console.log( sortArrayBy( arr, "", "a", false ) );


console.log( sortArrayBy( arr, "string", "b", true ) );

console.log( sortArrayBy( arr, "string", "b", false ) );
Run Code Online (Sandbox Code Playgroud)