[英]How to sort strings in JavaScript by code point values?
我需要對一個字符串數組進行排序,其中元素按字典順序作為代碼點值序列進行比較,例如, "Z" < "a" < "\?" < " " < "💩"
。
" " < "💩"
應該仍然成立)怎么辦? 對於這種特殊情況,是否有更有效的程序? 注意: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.