【问题标题】:Javascript sorting an ArrayJavascript 对数组进行排序
【发布时间】:2013-01-06 19:16:55
【问题描述】:

我正在尝试对带有值和文本的选择选项进行排序,如下所示。 文本可以有特殊字符并且需要排序。 但是我发现,一些特殊字符出现在字母之后。 我想要所有特殊字符,然后是字母。

c =    [["#test","#test"], ["?test", "?test"], ["test", "test"], ["TEst", "TEst"], ["]test", "]test"]]
    >>> c.sort()
    [["#test", "#test"], ["?test", "?test"], ["TEst", "TEst"], ["]test", "]test"], ["test", "test"]]

问题似乎是“测试”。

另一个简单的例子:

cool = ['#new','?new','[new',']new','NEw','&new','cool','ind']
["#new", "?new", "[new", "]new", "NEw", "&new", "cool", "ind"]
cool.sort()
["#new", "&new", "?new", "NEw", "[new", "]new", "cool", "ind"]

【问题讨论】:

    标签: javascript arrays selection


    【解决方案1】:

    问题特别是带有ASCII codes 91-96 and 123-126 的字符,它们是标点符号或特殊字符,但其代码比字母字符高。所以你的排序函数需要考虑到这一点。

    例如,您可以通过将这些字符映射到较低的 ASCII 字符来做到这一点。 http://jsfiddle.net/LGjnY/4/

    function transformString(s) {
      var r = '',
        code;
      for (var i = 0; i < s.length; i++) {
        code = s.charCodeAt(i);
        // map 91-96 onto 22-27
        if (code >= 91 && code <= 96) code -= 69; 
        // map 123-126 onto 28-31
        else if (code >= 123 && code <= 126) code -= 95; 
        r += String.fromCharCode(code);
      }
      return r;
    }
    c.sort(function (a, b) {
      return transformString(a[0]).localeCompare(transformString(b[0]));
    });
    

    或者将比较和转换结合起来让它更快(jsfiddle;没有真正测试过)

    function compareTransformedStrings(a, b) {
        if (a == b) return 0;
        for (var i = 0, A, B; (A = a.charCodeAt(i)) && (B = b.charCodeAt(i)); i++) {
            if (A != B) {
                return A - (A >= 91 && A <= 96) * 69 - (A >= 123 && A <= 126) * 95
                    < B - (B >= 91 && B <= 96) * 69 - (B >= 123 && B <= 126) * 95 
                    ? -1 : 1;
            }
        }
        return a.length < b.length ? -1 : 1;
    }
    c.sort(function (a, b) {
        return compareTransformedStrings(a[0], b[0]);
    });
    

    【讨论】:

      【解决方案2】:

      您可以将比较函数作为.sort() 函数参数传递,例如

      c.sort(function(a, b) {
          if (a.charCodeAt(0) <= 49) {
              return -1;
          }
      
          return a.localeCompare(b);
      })
      

      演示:http://jsfiddle.net/7DUEg/

      【讨论】:

      • 在示例中,这与默认排序没有任何区别。我猜当ab 都低于 ASCII 49 时,排序顺序将是不确定的?
      • @Stuart:显然我给了 OP 一个 idea 如何改进他的代码以达到预期的结果。由 OP 更改比较函数以适应所有要求。
      • 很公平,只是想检查一下我没有误解您的代码。
      • 是的,它给出了默认结果。谢谢你的想法。
      猜你喜欢
      • 1970-01-01
      • 2018-06-05
      • 2022-06-17
      • 2021-12-13
      • 2011-10-23
      • 2020-05-30
      • 2022-01-18
      • 1970-01-01
      相关资源
      最近更新 更多