如何在 JavaScript 中创建自定义字母顺序?

How to create custom alphabetical order in JavaScript?

我编写的自定义脚本有自定义字母顺序。它在以下代码中定义,以及我尝试指定 alphabetize 算法的尝试,但该算法不起作用。

const symbols = [
  { ascii: "i", unicode: "\u0470" },
  { ascii: "a", unicode: "\u0500" },
  { ascii: "u", unicode: "\u03f0" },

  { ascii: "e", unicode: "\u0410" },
  { ascii: "E", unicode: "\u0450" },
  { ascii: "U", unicode: "\u04a0" },

  { ascii: "I", unicode: "\u03d0" },
  { ascii: "o", unicode: "\u04e0" },
  { ascii: "A", unicode: "\u03b0" },

  { ascii: "O", unicode: "\u04c0" },
  { ascii: "o#", unicode: "\u0390" },
  { ascii: "u#", unicode: "\u0430" },

  { ascii: "e#", unicode: "\u0451" },
  { ascii: "i#", unicode: "\u03d1" },
  { ascii: "a#", unicode: "\u0501" },

  { ascii: "m", unicode: "\u0100" },
  { ascii: "n", unicode: "\u0140" },
  { ascii: "q", unicode: "\u0160" },
  { ascii: "g", unicode: "\u0130" },
  { ascii: "d", unicode: "\u0060" },
  { ascii: "b", unicode: "\u0040" },
  { ascii: "p", unicode: "\u0030" },
  { ascii: "t", unicode: "\u00d0" },
  { ascii: "k", unicode: "\u0050" },

  { ascii: "h", unicode: "\u0120" },
  { ascii: "l", unicode: "\u0170" },
  { ascii: "w", unicode: "\u0110" },

  { ascii: "f", unicode: "\u00c0" },
  { ascii: "s", unicode: "\u0070" },
  { ascii: "C", unicode: "\u00b0" },

  { ascii: "z", unicode: "\u0090" },
  { ascii: "v", unicode: "\u00f0" },
  { ascii: "y", unicode: "\u0180" },

  { ascii: "x", unicode: "\u0190" },
  { ascii: "r", unicode: "\u00e0" },

  { ascii: "c", unicode: "\u0080" },
  { ascii: "j", unicode: "\u0150" },
  { ascii: "Q", unicode: "\u01a0" },

  { ascii: "S", unicode: "\u0072" },
  { ascii: "Z", unicode: "\u0092" },
  { ascii: "H", unicode: "\u0122" },

  { ascii: "'", unicode: "\u01b0" },
]

const alphabet = symbols.map(o => o.ascii)

const words = [
  'He',
  'Hix',
  'Hex',
  'SoHiz',
  'SoH',
  'xo',
  'SoHi',
  'Hi',
  'CU'
]

const alphabetize = (array, alphabet) => {
  return array.sort((a, b) => {
    for (let i = 0, n = a.length; i < n; i++) {
      let x = a[i]
      let y = b[i]
      if (y) {
        let diff = alphabet.indexOf(x) - alphabet.indexOf(y)
        if (diff) return diff
      } else {
        return -1
      }
    }
  })
}

console.log(alphabetize(words, alphabet).join('\n'))

输出应该是:

CU
xo
SoH
SoHi
SoHiz
Hi
Hix
He
Hex

我在这里做错了什么,这如何成为最佳选择?

您需要考虑其中一个词何时比另一个词长

const symbols = [
  { ascii: "i", unicode: "\u0470" },
  { ascii: "a", unicode: "\u0500" },
  { ascii: "u", unicode: "\u03f0" },

  { ascii: "e", unicode: "\u0410" },
  { ascii: "E", unicode: "\u0450" },
  { ascii: "U", unicode: "\u04a0" },

  { ascii: "I", unicode: "\u03d0" },
  { ascii: "o", unicode: "\u04e0" },
  { ascii: "A", unicode: "\u03b0" },

  { ascii: "O", unicode: "\u04c0" },
  { ascii: "o#", unicode: "\u0390" },
  { ascii: "u#", unicode: "\u0430" },

  { ascii: "e#", unicode: "\u0451" },
  { ascii: "i#", unicode: "\u03d1" },
  { ascii: "a#", unicode: "\u0501" },

  { ascii: "m", unicode: "\u0100" },
  { ascii: "n", unicode: "\u0140" },
  { ascii: "q", unicode: "\u0160" },
  { ascii: "g", unicode: "\u0130" },
  { ascii: "d", unicode: "\u0060" },
  { ascii: "b", unicode: "\u0040" },
  { ascii: "p", unicode: "\u0030" },
  { ascii: "t", unicode: "\u00d0" },
  { ascii: "k", unicode: "\u0050" },

  { ascii: "h", unicode: "\u0120" },
  { ascii: "l", unicode: "\u0170" },
  { ascii: "w", unicode: "\u0110" },

  { ascii: "f", unicode: "\u00c0" },
  { ascii: "s", unicode: "\u0070" },
  { ascii: "C", unicode: "\u00b0" },

  { ascii: "z", unicode: "\u0090" },
  { ascii: "v", unicode: "\u00f0" },
  { ascii: "y", unicode: "\u0180" },

  { ascii: "x", unicode: "\u0190" },
  { ascii: "r", unicode: "\u00e0" },

  { ascii: "c", unicode: "\u0080" },
  { ascii: "j", unicode: "\u0150" },
  { ascii: "Q", unicode: "\u01a0" },

  { ascii: "S", unicode: "\u0072" },
  { ascii: "Z", unicode: "\u0092" },
  { ascii: "H", unicode: "\u0122" },

  { ascii: "'", unicode: "\u01b0" },
]

const alphabet = symbols.map(o => o.ascii)

const words = [
  'He',
  'Hix',
  'Hex',
  'SoHiz',
  'SoH',
  'xo',
  'SoHi',
  'Hi',
  'CU'
]

const alphabetize = (array, alphabet) => {
  return array.sort((a, b) => {
    for (let i = 0, n = a.length; i < n; i++) {
      let x = a[i]
      let y = b[i]
      if (y && x) {
        let diff = alphabet.indexOf(x) - alphabet.indexOf(y)
        if (diff) return diff
      } else if (y) {
        return -1
      } else {
        return 1
      }
    }
  })
}

console.log(alphabetize(words, alphabet).join('\n'))

两件事:

  • 如果 b[i] 未定义,则 return 值不应为 -1,而应为 1:这会将较短的 b 放在较长的 a.

  • for 循环有可能在没有 return 退出的情况下完成。在那种情况下,可能 ab 相等,或者 b 更长。对于这种情况,您需要 return 一个好的价值。

这里更正:

const symbols = [{ ascii: "i", unicode: "\u0470" },{ ascii: "a", unicode: "\u0500" },{ ascii: "u", unicode: "\u03f0" },{ ascii: "e", unicode: "\u0410" },{ ascii: "E", unicode: "\u0450" },{ ascii: "U", unicode: "\u04a0" },{ ascii: "I", unicode: "\u03d0" },{ ascii: "o", unicode: "\u04e0" },{ ascii: "A", unicode: "\u03b0" },{ ascii: "O", unicode: "\u04c0" },{ ascii: "o#", unicode: "\u0390" },{ ascii: "u#", unicode: "\u0430" },{ ascii: "e#", unicode: "\u0451" },{ ascii: "i#", unicode: "\u03d1" },{ ascii: "a#", unicode: "\u0501" },{ ascii: "m", unicode: "\u0100" },{ ascii: "n", unicode: "\u0140" },{ ascii: "q", unicode: "\u0160" },{ ascii: "g", unicode: "\u0130" },{ ascii: "d", unicode: "\u0060" },{ ascii: "b", unicode: "\u0040" },{ ascii: "p", unicode: "\u0030" },{ ascii: "t", unicode: "\u00d0" },{ ascii: "k", unicode: "\u0050" },{ ascii: "h", unicode: "\u0120" },{ ascii: "l", unicode: "\u0170" },{ ascii: "w", unicode: "\u0110" },{ ascii: "f", unicode: "\u00c0" },{ ascii: "s", unicode: "\u0070" },{ ascii: "C", unicode: "\u00b0" },{ ascii: "z", unicode: "\u0090" },{ ascii: "v", unicode: "\u00f0" },{ ascii: "y", unicode: "\u0180" },{ ascii: "x", unicode: "\u0190" },{ ascii: "r", unicode: "\u00e0" },{ ascii: "c", unicode: "\u0080" },{ ascii: "j", unicode: "\u0150" },{ ascii: "Q", unicode: "\u01a0" },{ ascii: "S", unicode: "\u0072" },{ ascii: "Z", unicode: "\u0092" },{ ascii: "H", unicode: "\u0122" },{ ascii: "'", unicode: "\u01b0" },];

const alphabet = symbols.map(o => o.ascii);

const words = ['He','Hix','Hex','SoHiz','SoH','xo','SoHi','Hi','CU']

const alphabetize = (array, alphabet) => {
  return array.sort((a, b) => {
    for (let i = 0, n = a.length; i < n; i++) {
      let x = a[i];
      let y = b[i];
      if (y) {
        let diff = alphabet.indexOf(x) - alphabet.indexOf(y);
        if (diff) return diff;
      } else {
        return 1; // <-- corrected
      }
    }
    return a.length - b.length; // is 0 or negative
  })
}

console.log(alphabetize(words, alphabet).join('\n'));