【问题标题】:Sorting javascript array using function 'sort"使用函数'sort'对javascript数组进行排序
【发布时间】:2012-08-17 11:19:58
【问题描述】:

我正在尝试对一个 javascript 数组进行排序,该数组包含任何类型的数据,比如数字、字符串、日期、时间等。我的逻辑适用于除数字以外的所有数据类型。它将数字视为字符串。

例如,我有一个如下数组:

array = ["1","2","12","22","33","3"]

我希望排序后的数组是1,2,3,12,22,33…,但它给出的是:1,12,2,22,3,33…

任何人都可以改进我的代码,它必须适用于任何类型的数据类型。

这是我的排序代码:

function sortTable(a,b){
    if(sortMode=="A"){
    if(a[1]>b[1]) return 1;
        if(a[1]<b[1]) return -1;
    }
    else if( sortMode=="D"){
        if(a[1]>b[1]) return -1;
        if(a[1]<b[1]) return 1;
    }
    return 0;     
}
array.sort(sortTable);

注意:我无法预测我的数组中将包含哪种数据类型的数据……所以排序函数必须是通用的。意思是,我不能为不同的数据类型调用不同的排序技术函数……请确保排序函数适用于所有数据类型。

【问题讨论】:

  • 您不能像这样创建一个适用于 all 数据类型的排序函数。您必须让它接受一个标志,该标志定义了应该如何对值进行排序(例如,按数字、按字典顺序),并且可能是一个转换器函数。这不仅仅是精炼代码...如果您只是想让字符串按数字排序,请将字符串转换为数字,此处对此进行了说明:stackoverflow.com/questions/1133770/…
  • 我可以将我的字符串解析为整数..但是如果我的数组是这样的{"India","China","Russia"}。我们可以将这些字符串转换为整数吗?谢谢..
  • 如果数组包含多种数据类型,你知道这些类型应该如何排序吗?也就是说,日期应该在字符串之前,数字在日期之前,等等?
  • 所以你的数组可以是["1", "12", "2", "India", "China"]?您希望它在排序后会是什么样子?
  • @RamaRaoM 您可以编写一个排序函数来检查被排序的值的类型,但这似乎不必要地笨重,即使您这样做,您怎么知道在某些情况下,您的字符串需要强制转换成数字吗?

标签: javascript sorting


【解决方案1】:

您没有得到您期望的输出的原因是当两个操作数都是字符串类型时,它们之间会按字母顺序进行比较。它们不会自动转换为数字。

"2" > "12" // result is true

如果其中一个操作数是数字,但比较运算符会将另一个操作数从字符串转换为数字。

"2" > 12 // result is false

要指出的另一件事是,在数字数组的情况下,您正试图访问索引 1 处的数组元素。

if(a[1]>b[1]) return 1;

这应该是:

if( a > b ) return 1;

我会单独处理每种数据类型,而不是编写这样的通用函数。

【讨论】:

    【解决方案2】:

    我写了几个检查某些数据结构的正则表达式条件。 (你总是可以只做一个大的 switch 语句,根据 'typeof(a)' 或 'typeof(b)' 是什么来分支。)这些检查确定字符串中的值是否应该被解释为字符串以外的东西。

    function sortVals(a,b){
        //other code here  
        var aT=a+"", bT=b+"";    //a and b as strings
        if(!aT.match(/[^0-9]/) && !bT.match(/[^0-9]/)){//no non-numbers were found
            a = parseInt(aT, 10);
            b = parseInt(bT, 10);
            if(a!=b)
                return a<b?1:-1;    //returns 1 if a<b; -1 if a>b
        }else if(!aT.match(/[^0-9\.]|\..*\./) && !bT.match(/[^0-9\.]|\..*\./)){//only valid floats were found
            a = parseFloat(aT);
            b = parseFloat(bT);
            if(a!=b)
                return a<b?1:-1;
        }
    }
    

    我不知道这是否是你想要的一部分,但如果你想要任何数据类型的排序函数,你需要做一些工作。祝你好运!

    【讨论】:

      【解决方案3】:

      如前所述,您需要识别数据类型。但是这里有一个,您可以将其用于字符串/整数。

      var sortMethod = function(x,y){
          var a = x|0 , 
              b = y|0; 
          return (a>b) ? 1 : -1;
      });
      
      var x = ["1", "34" , "3" , "12"].sort(sortMethod);
      var y = [3,52,123,1].sort(sortMethod); 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-11-13
        • 2021-07-26
        • 1970-01-01
        • 2012-11-30
        • 1970-01-01
        • 2018-10-19
        • 1970-01-01
        相关资源
        最近更新 更多