【发布时间】:2022-06-21 19:10:30
【问题描述】:
如何为字符串生成数字分数,以便以后用户按字母顺序排序?
(我想将 objectIds 添加到基于 name 属性的 redis 排序集中。这需要一个数字分数。我的事物列表可能太大而无法一次排序,因此想要对每个项目进行评分单独)
字母表中较早的单词的分数应该较低,'a' = 0。
到目前为止我的天真方法; (来自Replace a letter with its alphabet position的字母字母位置)
function alphaScoreString(inputString) {
let score = 0
inputString
.trim()
.toLowerCase()
.split('')
.map((letter, index) => {
const letterNumber = parseInt(letter, 36) - 10
if (letterNumber >= 0) {
score += letterNumber / (index + 1)
}
})
return score * 1000
}
这不起作用,因为
alphaScoreString('bb')
1500
alphaScoreString('bc')
2000
alphaScoreString('bbz')
9833.333333333334
您可以看到“bbz”的得分高于“bc”,但应该更低,因为在字母列表中“bbz”会排在“bc”之前。
【问题讨论】:
-
这是一个非常有趣的问题。只是为了澄清 - 字符串的长度是否有限?如果不是,那么实现这样的函数将非常困难,因为例如,字符串 'a' * n 总是必须产生小于字符串 'b' 的分数,无论 n 有多大。跨度>
-
是的,这是一个棘手的问题!字符串在技术上没有限制,但在这种情况下它们是姓氏,所以我们可以假设小于... 25?如果由于第 26 个字母而导致一些较长的名称顺序错误,我认为没有人会注意到。
-
如果字母表中较早的单词应该有较低的分数,而关键是稍后按该分数对单词进行排序......**为什么不直接对单词进行正常排序**?跨度>
-
因为稍后我将只有对象的分数和 ID,而不是单词本身。
标签: javascript