JavaScript数组使用动态列排序

时间:2019-05-10 09:13:45

标签: javascript arrays function sorting object

我有一些使用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;

}

因此,列名可以包含在参数中

4 个答案:

答案 0 :(得分:4)

您可以通过在所需键上使用闭包来颠倒这种方法。

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

答案 1 :(得分:3)

使用如下方括号

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

答案 2 :(得分:2)

使用[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;

}

答案 3 :(得分:1)

方括号符号:

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