求助:实现提取姓名数组中间名的函数,splice方法使用遇阻
解决getMiddleNames函数的实现问题
我完全理解你尝试许久却卡壳的挫败感!咱们来一步步拆解这个需求,搞定这个函数。
首先明确需求:
- 输入:一个包含完整姓名的数组,每个姓名由空格分隔(比如
["John Michael Doe", "Jane Smith", "Robert James William Brown"]) - 输出:对应每个姓名的中间名数组,没有中间名的位置填充
null;如果有多个中间名,将它们拼接成一个字符串(比如第三个姓名的中间名是"James William")
你的核心问题分析
你提到splice方法使用无效,大概率是因为没有正确处理分割后的姓名数组,或者误用了splice的参数(splice(startIndex, deleteCount)),也可能是没考虑到splice会直接修改原数组的特性,导致后续逻辑出错。
完整实现代码
function getMiddleNames(names) { const solution = []; for (const name of names) { // 去除首尾空格,用正则分割处理可能的多空格情况 const nameParts = name.trim().split(/\s+/); // 判断是否存在中间名:姓名拆分后长度≤2时,无中间名 if (nameParts.length <= 2) { solution.push(null); } else { // 复制拆分后的数组,避免splice修改原数组影响后续判断 const partsCopy = [...nameParts]; // 从索引1开始,删除「总长度-2」个元素(跳过首名和末名) const middleNames = partsCopy.splice(1, nameParts.length - 2); // 把多个中间名拼接成字符串(若只有一个则直接返回该字符串) solution.push(middleNames.join(' ')); } } return solution; }
关键步骤解释
- 安全分割姓名:用
trim()清理首尾空格,再用/\s+/正则分割,能兼容姓名中不小心输入的多个空格,确保拆分后的数组是干净的姓名片段。 - 判断中间名存在性:如果拆分后的数组长度≤2,说明只有名和姓(甚至只有单个姓名片段),这种情况直接填充
null。 - 正确使用splice:
- 先通过扩展运算符复制数组,避免
splice修改原数组导致的意外问题; splice(1, nameParts.length - 2)精准定位中间名:从索引1(跳过首名)开始,删除「总长度-2」个元素(减去首名和末名的数量),返回的结果就是所有中间名组成的数组。
- 先通过扩展运算符复制数组,避免
- 拼接多中间名:如果存在多个中间名,用
join(' ')拼接成符合常规表达的字符串,单个中间名则直接返回该字符串。
测试示例
// 测试用例 console.log(getMiddleNames(["John Michael Doe", "Jane Smith", "Robert James William Brown", "Alice"])); // 输出:["Michael", null, "James William", null]
如果需要调整细节(比如希望中间名返回数组而非字符串),只需要去掉join(' '),直接把middleNames推入结果数组即可~
内容的提问来源于stack exchange,提问作者VisualXZ
相关产品推荐
相关产品推荐

