3

给定一组单词,我需要将它们放在以单词的第一个字母为键的散列中。我有单词 = {},键 A..Z 和 0 表示数字和符号。我正在做类似的事情

var firstLetter = name.charAt(0);
    firstLetter = firstLetter.toUpperCase();

if (firstLetter < "A" || firstLetter > "Z") {
    firstLetter = "0";
}
if (words[firstLetter] === undefined) {
    words[firstLetter] = [];
} 
words[firstLetter].push(name);

但这会因分词和其他字符而失败,例如Ärzteversorgung一词。那个词放在“0”数组中,我怎么能把它放在“A”数组中?

4

5 回答 5

15

您可以使用它来测试一个字符是否可能是一个字母:

var firstLetter = name.charAt(0).toUpperCase();
if( firstLetter.toLowerCase() != firstLetter) {
    // it's a letter
}
else {
    // it's a symbol
}

这是有效的,因为 JavaScript 已经有一个小写到大写字母的映射(反之亦然),所以如果一个字符没有改变,toLowerCase()那么它就不在字母表中。

于 2012-05-22T18:42:42.230 回答
5

尝试将字符转换为大写和小写,并检查是否有区别。只有字母字符在转换为各自的大小写时会发生变化(数字、标点符号等不会)。下面是一个使用这个概念的示例函数:

function isALetter(charVal)
{
    if( charVal.toUpperCase() != charVal.toLowerCase() )
       return true;
    else
       return false;
}
于 2014-08-19T11:22:41.847 回答
4

您可以使用正则表达式。不幸的是,JavaScript 不认为国际字符是“单词字符”。但是你可以使用下面的正则表达式来做到这一点:

var firstLetter = name.charAt(0);
firstLetter = firstLetter.toUpperCase();
if (!firstLetter.match(/^\wÀÈÌÒÙàèìòùÁÉÍÓÚÝáéíóúýÂÊÎÔÛâêîôûÃÑÕãñõÄËÏÖÜäëïöüçÇßØøÅåÆæÞþÐð$/)) {
    firstLetter = "0";
}
if (words[firstLetter] === undefined) {
    words[firstLetter] = [];
} 
words[firstLetter].push(name);
于 2012-05-22T18:45:54.553 回答
2

您可以使用.charCodeAt(0);获取 ASCII 图表中的位置,然后进行一些检查。

您要查找的范围可能是 65-90、97-122、128-154、160-165(含),但请通过查看ASCII 图表仔细检查

像这样的东西

if((x>64&&x<91)||(x>96&&x<123)||(x>127&&x<155)||(x>159&&x<166))

x字符代码在哪里

于 2012-05-22T18:44:29.550 回答
1

幸运的是,这在没有外部库的情况下现在是可能的。直接来自文档

let story = "It’s the Cheshire Cat: now I shall have somebody to talk to.";

// Most explicit form
story.match(/\p{General_Category=Letter}/gu);

// It is not mandatory to use the property name for General categories
story.match(/\p{Letter}/gu);
于 2020-03-24T08:17:53.750 回答