0

次のように、値とテキストを使用して選択オプションをソートしようとしています。テキストには特殊文字を含めることができ、ソートする必要があります。しかし、いくつかの特殊文字がアルファベットの後に来ていることがわかりました。最初にすべての特殊文字が必要で、次に Alphabets が必要です。

c =    [["#test","#test"], ["?test", "?test"], ["test", "test"], ["TEst", "TEst"], ["]test", "]test"]]
    >>> c.sort()
    [["#test", "#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"]
4

2 に答える 2

2

この問題は特に、ASCII コード 91-96 および 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]);
});
于 2013-01-06T10:11:02.227 に答える
2

次のように、比較関数を.sort()関数引数として渡すことができます

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

    return a.localeCompare(b);
})

デモ: http://jsfiddle.net/7DUEg/

于 2013-01-06T09:59:09.217 に答える