【问题标题】:Sorting Multidimensional Array with Javascript: Integers使用 Javascript 对多维数组进行排序:整数
【发布时间】:2011-02-08 21:54:46
【问题描述】:

我有一个名为“结果”的二维数组。结果中的每个“行”数组都包含字符串和整数值。我正在使用此脚本按 onclick 事件上的任何“列”对数组进行排序:

function sort_array(results, column, direction) {
var sorted_results = results.sort(value);
function value(a,b) {
    a = a[column];
    b = b[column];
    return a == b ? 0 : (a < b ? -1*direction : 1*direction)
    }
}

这适用于带有字符串的列。但它将整数列视为字符串而不是数字。例如,如果“升序”或 97、200、15、1000“降序”,值 15、1000、200、97 将按 1000、15、200、97 排序。

我已经仔细检查了整数值的typeof,脚本知道它们是数字。我怎样才能让它这样对待他们?

【问题讨论】:

    标签: javascript sorting multidimensional-array


    【解决方案1】:

    使 a 和 b 的类型成为决定 value 函数返回的比较的一部分。在此过程中,您必须决定如何相对于字符串对整数进行排序。

    或者,您可以使用一个比较函数来获取值,并进行替换以将每个数字字符串替换为固定长度的数字字符串,前导零,然后进行字符串比较。这种方法的一个好处是您最终可以对人们普遍喜欢的“a2”、“a9”、“a10”等内容进行排序。

    【讨论】:

      【解决方案2】:

      你确定它们是数字吗?你是怎么检查的?尝试此修改以强制它们为数字以防万一:

      if (isNumberColumn(column)) {
          a = +a;
          b = +b;
      }
      

      【讨论】:

        【解决方案3】:

        我认为您必须在排序之前对列中的值进行初步传递。为什么?好吧,您需要提前(即在排序之前)知道是否所有值都可以视为数字。如果可以,那么“值”函数可以转换它们。否则,它应该将它们排序为字符串。

        【讨论】:

          【解决方案4】:

          您可以尝试制作适合您需要的比较函数。您可以定义自己的方式将字符串与整数进行比较。例如:

          function getDirection(a,b){
              if(typeof(a) == typeof(b))
                  return a == b ? 0 : (a>b?1:-1);
              a+="";b+="";
              if(a[0] == '-')
                  {
                      if(b[0] != '-')
                          return 1;
                  }
              else 
                  if(b[0] != '-')
                      return -1;
               return a[0] == b[0] ? 0 : (a[0]>b[0]?1:-1);
          }
          

          希望对你有帮助。

          【讨论】:

            【解决方案5】:

            首先:sort 是一个mutator,这意味着排序发生在原地。所以为了避免意外的后果,我会改变

            var sorted_results = results.sort(value);
            

            var sorted_results = results.slice(0).sort(value);
            

            当然,除非您希望它在适当的位置排序,但是您需要 sorted_results 变量做什么?

            至于排序本身 - 整数排序对我来说似乎工作得很好,问题实际上是混合整数和字符串场景中的字符串,如他的示例所示:http://jsfiddle.net/QJ5fM/,它对以下数组进行排序完全不同:

            [[16],[131],['aa'],['0hey'],[176],[100],['hey'],[1],[12]];
            [['aa'],[16],[131],['0hey'],[176],[100],['hey'],[1],[12]];
            [['aa'],['0hey'],[16],[131],[176],[100],['hey'],[1],[12]];
            

            在 chrome 9 中给出以下结果:

            1,12,0hey,aa,hey,16,100,131,176
            1,12,0hey,16,100,131,176,aa,hey
            1,12,16,100,131,176,0hey,aa,hey
            

            Firefox 3.6 中的以下内容:

            1,12,0hey,aa,hey,16,100,131,176
            1,12,0hey,hey,16,100,131,176,aa
            1,12,hey,16,100,131,176,0hey,aa
            

            以及ie8中的以下内容:

            0hey,aa,hey,1,12,16,100,131,176
            0hey,aa,hey,1,12,16,100,131,176
            0hey,aa,hey,1,12,16,100,131,176
            

            出乎意料的是,ie8 似乎有唯一健全的,或者至少是一致的实现:P

            【讨论】:

              猜你喜欢
              • 2011-10-23
              • 2012-11-27
              • 1970-01-01
              • 2017-11-09
              • 1970-01-01
              • 2018-06-21
              • 2015-07-11
              • 2010-10-13
              相关资源
              最近更新 更多