我正在尝试按字母顺序对字典中的匈牙利语单词进行排序。所有字母的预期顺序应该是 aábcdeéfggyhiíjklmnoóöőpqrsttyuúüüűvwxyz
我试图使用 Intl.Collator() 和 localeCompare 但预期的输出从来都不正确。
例如:
console.log(["baj", 'betűz', 'ä', "bácsi"].sort(new Intl.Collator('hu').compare));
//expected output ["ä", "baj", "bácsi", "betűz"]
我得到的是数组 ["ä", "bácsi", "baj", "betűz"]
á 在 a 之前,但应该在 a 之后
这也发生在 é 和 í 身上。
我正在尝试使用
.sort(function(a, b) {
let letterA = a.toUpperCase();
let letterB = b.toUpperCase();
if (letterA < letterB) {
return -1;
}
if (letterA > letterB) {
return 1;
}
return 0;
});
但是带有特殊符号的单词放在数组的末尾,这不是我想要的。
有关如何解决该问题的任何建议?
答案 0 :(得分:0)
您可以手动排序并使用给定的字母表获得所需的顺序。
const
alphabet = 'aábcdeéfggyhiíjklmnoóöőpqrsttyuúüűvwxyz',
order = Object.fromEntries([].map((c, i) => [c, i + 1])),
compare = (a, b) => {
let i = 0,
l = Math.min(a.length, b.length),
r = 0;
while (!r && i < l) {
r = a[i] in order && b[i] in order ? order[a[i]] - order[b[i]] : a[i].localeCompare(b[i]);
i++;
}
return r || a.length - b.length;
}
console.log(...["baj", 'betűz', 'ä', "bácsi"].sort(compare)); // ["ä", "baj", "bácsi", "betűz"]
答案 1 :(得分:0)
一段时间后,在我兄弟的大力帮助下,我们想出了一个解决方案,它基本上可以是任何字母
const wordList = [
{ id: 1, word_hu: 'búcsúajándék' },
{ id: 2, word_hu: 'Bőrönd' },
{ id: 3, word_hu: 'betűz' },
{ id: 4, word_hu: 'bácsi' },
{ id: 5, word_hu: 'bejelöl' },
{ id: 10, word_hu: 'áfjklsdfjk' },
{ id: 18, word_hu: 'aáfjklsdffvk' },
{ id: 11, word_hu: 'azjklsdfjk' },
{ id: 21, word_hu: 'ahjklsdfjk' },
{ id: 6, word_hu: 'büfé' },
{ id: 7, word_hu: 'búcsúajándék' },
{ id: 8, word_hu: 'ceruza' },
{ id: 9, word_hu: 'baj' },
];
const alphabetIndex = {
a: 1,
á: 2,
b: 3,
c: 4,
d: 5,
e: 6,
é: 7,
f: 8,
g: 9,
h: 10,
i: 11,
í: 12,
j: 13,
k: 14,
l: 15,
m: 16,
n: 17,
o: 18,
ó: 19,
ö: 20,
ő: 21,
p: 22,
q: 23,
r: 24,
s: 25,
t: 26,
u: 27,
ú: 28,
ü: 29,
ű: 30,
v: 31,
w: 32,
x: 33,
y: 34,
z: 35,
};
const getWordsPair = (aWord, bWord) => {
const aWordArray = aWord.toLowerCase().replace(" ", "").split('');
const bWordArray = bWord.toLowerCase().replace(" ", "").split('');
let shouldReturn = false;
return aWordArray.reduce(
(acc, aWordletter, aWordIndex) => {
if (shouldReturn) {
return acc;
}
const bWordLetter = bWordArray[aWordIndex];
const aWordLetterNumber = alphabetIndex[aWordletter];
const bWordLetterNumber = alphabetIndex[bWordLetter];
acc[0].push(aWordLetterNumber);
acc[1].push(bWordLetterNumber);
shouldReturn = aWordLetterNumber !== bWordLetterNumber;
return acc;
},
[[], []]
);
}
const sortWords = (list) => {
return list.sort((aWordObject, bWordObject) => {
const aWord = aWordObject.word_hu;
const bWord = bWordObject.word_hu;
const wordsPair = getWordsPair(aWord, bWord);
const mappedAWord = wordsPair[0].join('');
const mappedBWord = wordsPair[1].join('');
return mappedAWord - mappedBWord;
});
};
const sortedList = sortWords(wordList);