簡體   English   中英

如何按代碼點值對 JavaScript 中的字符串進行排序?

[英]How to sort strings in JavaScript by code point values?

我需要對一個字符串數組進行排序,其中元素按字典順序作為代碼點值序列進行比較,例如, "Z" < "a" < "\?" < " " < "💩"

  1. 除了手動迭代它們並比較相應的代碼點之外,是否有更有效的方法來比較字符串?
  2. 如果保證字符串沒有任何代理代碼點(但可能有代理對,所以" " < "💩"應該仍然成立)怎么辦? 對於這種特殊情況,是否有更有效的程序?

注意:StackOverflow 上有很多解釋如何對字符串進行排序的答案,但它們要么使用localeCompare順序,要么使用 JavaScript 比較運算符(將字符串作為 UTF-16 代碼單元的序列進行比較)定義的順序。 我對其中任何一個都不感興趣。

如何按代碼點值對 JavaScript 中的字符串進行排序?


這似乎是一個令人驚訝的難題。 這是概念驗證 (POC) 實現:

'use strict';

function compareCodePoints(s1, s2) {
    const len = Math.min(s1.length, s2.length);
    let i = 0;
    for (const c1 of s1) {
        if (i >= len) {
            break;
        }
        const cp1 = s1.codePointAt(i);
        const cp2 = s2.codePointAt(i);
        const order = cp1 - cp2;
        if (order !== 0) {
            return order;
        }
        i++;
        if (cp1 > 0xFFFF) {
            i++;
        }
    }
    return s1.length - s2.length;
}

let s =[];
let s1 = "abc𞸁z";
let s2 = "abc𞸂z";

s = [s1, s2];
console.log(s);
s.sort(compareCodePoints);
console.log(s);

console.log()

s = [s2, s1];
console.log(s);
s.sort(compareCodePoints);
console.log(s);

console.log()

s1 = "a";
s2 = "";

console.log([s1, s2]);
console.log(compareCodePoints(s1, s2));
console.log([s2, s1]);
console.log(compareCodePoints(s2, s1));

$ node codepoint.poc.js
[ 'abc𞸁z', 'abc𞸂z' ]
[ 'abc𞸁z', 'abc𞸂z' ]

[ 'abc𞸂z', 'abc𞸁z' ]
[ 'abc𞸁z', 'abc𞸂z' ]

[ 'a', '' ]
1
[ '', 'a' ]
-1
$

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM