如何解决匈牙利字典排序
我正在尝试按字母顺序对字典中的匈牙利语单词进行排序。所有字母的预期顺序应该是 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"]
我得到的是数组 ["ä","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;
});
但是带有特殊符号的单词放在数组的末尾,这不是我想要的。
有关如何解决该问题的任何建议?
解决方法
您可以手动排序并使用给定的字母表获得所需的顺序。
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"]
一段时间后,在我兄弟的大力帮助下,我们想出了一个解决方案,它基本上可以是任何字母
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,{ 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);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。