如何在JavaScript中优雅实现多词姓名的拆分逻辑?
姓名拆分逻辑优化问题
问题描述
我有一个字符串:
fullName = 'Ross beddy washington andres'
需要将其拆分为firstName、middleName和lastName,拆分规则如下:
- 2个词:第1个为lastName,第2个为firstName
- 3个词:第1、2个为lastName,第3个为firstName
- 4个词:第1、2个为lastName,第3个为firstName,第4个为middleName
- 5个及以上词:遵循4个词的规则
示例输出:
firstName = washington
middleName = andres
lastName = Ross beddy
我的现有代码:
const fullName = 'Ross beddy washington andres'; const names = {}; const nameSplit = fullName.split(' '); if (nameSplit.length == 4) { names.firstName = nameSplit[2]; names.lastName = nameSplit[0] + ' ' + nameSplit[1]; names.middleName = nameSplit[3]; } else if (nameSplit.length == 3) { names.firstName = nameSplit[2]; names.lastName = nameSplit[0] + ' ' + nameSplit[1]; names.middleName = ''; } else if (nameSplit.length == 2){ names.firstName = nameSplit[1]; names.lastName = nameSplit[0] ; names.middleName = '' } console.log(names);
请问如何添加5个及以上词的处理逻辑?是否有更优雅的实现方式?
解决方案
1. 处理5个及以上词的逻辑
根据规则,5个及以上词遵循4个词的拆分逻辑,只需将原有代码中判断length == 4的条件改为length >= 4即可,这样4个及以上词的场景都会复用同一套逻辑:
const fullName = 'Ross beddy washington andres taylor'; const names = {}; const nameSplit = fullName.split(' '); if (nameSplit.length >= 4) { names.firstName = nameSplit[2]; names.lastName = nameSplit[0] + ' ' + nameSplit[1]; names.middleName = nameSplit[3]; } else if (nameSplit.length == 3) { names.firstName = nameSplit[2]; names.lastName = nameSplit[0] + ' ' + nameSplit[1]; names.middleName = ''; } else if (nameSplit.length == 2){ names.firstName = nameSplit[1]; names.lastName = nameSplit[0] ; names.middleName = '' } console.log(names); // 输出:{ firstName: 'washington', lastName: 'Ross beddy', middleName: 'andres' }
如果实际需求是将第4个及以后的所有词合并为middleName(比如5个词时middleName为andres taylor),可以把middleName的赋值改为:
names.middleName = nameSplit.slice(3).join(' ');
2. 更优雅的实现方式
可以通过提取通用逻辑、封装函数的方式减少重复代码,提升可读性和复用性:
const parseFullName = (fullName) => { const nameParts = fullName.split(' '); const len = nameParts.length; const result = { lastName: '', firstName: '', middleName: '' }; if (len === 2) { [result.lastName, result.firstName] = nameParts; } else if (len >= 3) { // 取前两个词作为lastName result.lastName = nameParts.slice(0, 2).join(' '); // 第三个词作为firstName result.firstName = nameParts[2]; // 4个及以上词时,取第4个及以后的所有词作为middleName(可根据需求调整为只取第4个) result.middleName = len >= 4 ? nameParts.slice(3).join(' ') : ''; } return result; }; // 测试不同场景 console.log(parseFullName('Ross beddy washington andres')); console.log(parseFullName('Ross beddy washington')); console.log(parseFullName('Ross beddy')); console.log(parseFullName('Ross beddy washington andres taylor'));
这种写法把拆分逻辑封装成独立函数,支持各种长度的姓名输入,同时代码结构清晰,易于维护和修改。
内容的提问来源于stack exchange,提问作者Mar1009
相关产品推荐
相关产品推荐

