使用动态列的 JavaScript 数组排序 [重复]

Posted

技术标签:

【中文标题】使用动态列的 JavaScript 数组排序 [重复]【英文标题】:JavaScript Array Sort with Dynamic Column [duplicate] 【发布时间】:2019-09-28 04:07:39 【问题描述】:

我有一些使用 javascript 数组排序的代码,它有效,但似乎效率很低。

出于示例目的,我有一个如下定义的对象数组

dummyData = [];
dummyData.push( col01:"aa", col02:"ac", col03:"ab" );
dummyData.push( col01:"ab", col02:"ab", col03:"ac" );
dummyData.push( col01:"ac", col02:"aa", col03:"aa" );

然后我可以使用这样的函数对 col01 进行排序

function f_sort_col01(dataArg) 

   dataArg.sort(function(res01, res02) 
      var arg01 = res01.col01.toLowerCase();
      var arg02 = res02.col01.toLowerCase();
      if(arg01 < arg02)  return -1; 
      if(arg01 > arg02)  return 1; 
      return 0;
   );

   return dataArg;


这很好用,但问题是当我需要在不同的列上排序时,我必须创建一个像这样的全新函数

function f_sort_col02(dataArg) 

   dataArg.sort(function(res01, res02) 
      var arg01 = res01.col02.toLowerCase();
      var arg02 = res02.col02.toLowerCase();
      if(arg01 < arg02)  return -1; 
      if(arg01 > arg02)  return 1; 
      return 0;
   );

   return dataArg;


这几乎是同一件事,只是在不同的列上。我想知道是否有可能按照这种方式做一些事情

function f_sort(dataArg, colName) 

   dataArg.sort(function(res01, res02) 
      var arg01 = res01.colName.toLowerCase();
      var arg02 = res02.colName.toLowerCase();
      if(arg01 < arg02)  return -1; 
      if(arg01 > arg02)  return 1; 
      return 0;
   );

   return dataArg;


这样可以在参数中包含列名

【问题讨论】:

【参考方案1】:

您可以通过对所需键使用闭包来反转该方法。

function sortBy(key) 
    return function (a, b) 
        return a[key].toLowerCase().localeCompare(b[key].toLowerCase());
    ;


var data = [ col01: "aa", col02: "ac", col03: "ab" ,  col01: "ab", col02: "ab", col03: "ac" ,  col01: "ac", col02: "aa", col03: "aa" ];

console.log(data.sort(sortBy('col01')));
console.log(data.sort(sortBy('col02')));
console.log(data.sort(sortBy('col03')));
.as-console-wrapper  max-height: 100% !important; top: 0; 

【讨论】:

这也是超级漂亮的代码,我非常喜欢它【参考方案2】:

方括号表示法:

var arg01 = res01[colName].toLowerCase();
var arg02 = res02[colName].toLowerCase();

【讨论】:

【参考方案3】:

使用[colName] 而不是.colName

function f_sort(dataArg, colName) 

   dataArg.sort(function(res01, res02) 
      var arg01 = res01[colName].toLowerCase();
      var arg02 = res02[colName].toLowerCase();
      if(arg01 < arg02)  return -1; 
      if(arg01 > arg02)  return 1; 
      return 0;
   );

   return dataArg;


【讨论】:

【参考方案4】:

像下面这样使用方括号

function f_sort(dataArg, colName) 

   dataArg.sort(function(res01, res02) 
      var arg01 = res01[colName].toLowerCase();
      var arg02 = res02[colName].toLowerCase();
      if(arg01 < arg02)  return -1; 
      if(arg01 > arg02)  return 1; 
      return 0;
   );
   return dataArg;

【讨论】:

哇,我是个白痴,非常感谢,有这么好的简单答案真是一种解脱,我会尽快接受这个答案 @TheLovelySausage - 很高兴为您提供帮助!

以上是关于使用动态列的 JavaScript 数组排序 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript算法-排序算法

JavaScript学习(六十六)—字符串对象常用的属性和方法总结以及数组元素的排序问题

代码与算法集锦-归并排序+树状数组+快排+深度优先搜索+01背包(动态规划)

在 Javascript 中动态修改或生成代码

直面JavaScript数据处理的5个常见疑难杂症

用户动态显示隐藏列,可排序