匈牙利字典排序

时间:2021-01-21 17:09:25

标签: javascript sorting compare collator

我正在尝试按字母顺序对字典中的匈牙利语单词进行排序。所有字母的预期顺序应该是 aábcdeéfggyhiíjklmnoóöőpqrsttyuúüüűvwxyz

我试图使用 Intl.Collat​​or() 和 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;
});

但是带有特殊符号的单词放在数组的末尾,这不是我想要的。

有关如何解决该问题的任何建议?

2 个答案:

答案 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);
相关问题