如何在 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
退出的情况下完成。在那种情况下,可能 a
和 b
相等,或者 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'));
我编写的自定义脚本有自定义字母顺序。它在以下代码中定义,以及我尝试指定 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
退出的情况下完成。在那种情况下,可能a
和b
相等,或者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'));