使用JavaScript提取姓名首字母问题:多名字场景处理失效
提取姓名首字母的优化方案(适配多名字、附加信息场景)
原代码仅能处理单名+姓氏的简单姓名格式,当遇到多名字、带"of 国家"附加信息或罗马数字后缀的姓名时,无法得到符合预期的首字母结果。我们需要提取第一个名字和最后一个真实姓氏的首字母,最终得到JJ, WS, GC, CT, PP, JL这样的输出。
优化后代码
const names = ["Joshua Jones of USA", "William Sanders", "Grey Charles", "Carlos James Thomas of Russia", "Peter John Parker", "Juan Carlos Tenaz Lopez III of Spain"]; function getUserInitials(name) { let words = name.split(' '); // 移除"of 国家"这类非姓名的附加信息 const ofIndex = words.indexOf('of'); if (ofIndex !== -1) { words = words.slice(0, ofIndex); } // 过滤掉罗马数字后缀(如III、IV这类非姓氏内容) const filteredWords = words.filter(word => !/^[IVXLCDM]+$/i.test(word)); // 取第一个名字和最后一个姓氏的首字母拼接 const firstInitial = filteredWords[0].charAt(0).toUpperCase(); const lastInitial = filteredWords.at(-1).charAt(0).toUpperCase(); return firstInitial + lastInitial; } // 执行测试并输出结果 const result = names.map(getUserInitials).join(', '); console.log(result); // 输出:JJ, WS, GC, CT, PP, JL
代码逻辑说明
- 分割与截断附加信息:将姓名按空格拆分为单词数组后,找到"of"的位置,截断掉"of"及之后的内容(如国家名),只保留核心姓名部分。
- 过滤非姓氏后缀:通过正则表达式过滤掉罗马数字格式的后缀(如III、II),这些属于身份标识而非真实姓氏。
- 提取首字母:从处理后的姓名数组中,取第一个单词的首字母(名字首字母)和最后一个单词的首字母(姓氏首字母),拼接为最终结果。
内容的提问来源于stack exchange,提问作者Joseph
相关产品推荐
相关产品推荐

