数组按首尾字母衔接重排功能异常:结果缺失元素求助
数组首尾字母衔接重排函数问题排查与修复
我写了个JavaScript函数,想实现数组元素按首尾字母衔接的规则重排——以第一个元素为起点,依次找首字母和前一个元素尾字母匹配的元素衔接。比如输入["team", "token", "moist"],期望输出["team", "moist", "token"],但实际只得到["team", "moist"]。以下是我的代码:
let array = ["team", "token", "moist"]; let newArr = []; const reorderArr = () => { // reorder array by their last letter starting with the first array and so on console.log("ARRAY:", array); array.forEach((arr, index) => { let currentWord = arr; console.log("LOOP: ", index); if (!newArr.includes(currentWord)) { if (index === 0) { console.log("HIT ONCE"); newArr.push(currentWord); } else { for (let x = 1; x < array.length; x++) { const nextWord = array[x]; console.log("nextWord", nextWord); if (nextWord.slice(0, 1) === newArr[newArr.length - 1].slice(-1)) { console.log("HIT"); newArr.push(nextWord); } } } } }); console.log("REORDERED ARRAY:", newArr); // RESULT SHOULD BE ["team", "moist", "token"] }; reorderArr();
问题排查
- 循环逻辑混乱:原代码用
forEach遍历原数组,同时嵌套for循环,只会在forEach的非0索引循环里执行一轮匹配,不会持续寻找下一个符合条件的元素。比如找到moist加入后,就不会再去匹配moist的尾字母t对应的token。 - 重复元素处理错误:
!newArr.includes(currentWord)的判断位置不对,导致后续遍历到token时,无法触发匹配逻辑去对接moist的尾字母。 - 未跟踪已使用元素:没有从候选池中移除已加入结果的元素,可能导致重复添加,也无法准确找到下一个可用的匹配项。
修复后的代码
修复思路:
- 复制原数组作为候选池,避免修改原数组,同时方便移除已使用元素
- 从第一个元素开始初始化结果数组
- 循环寻找匹配项:每次拿结果最后一个元素的尾字母,在候选池中找首字母匹配的元素,找到后加入结果并移除,直到找不到匹配项或候选池为空
const array = ["team", "token", "moist"]; const reorderArr = (arr) => { const remaining = [...arr]; const result = []; // 初始化结果数组 if (remaining.length > 0) { result.push(remaining.shift()); } // 持续寻找下一个匹配元素 while (true) { const lastWord = result[result.length - 1]; if (!lastWord) break; // 忽略大小写匹配首尾字母 const matchIndex = remaining.findIndex(word => word[0].toLowerCase() === lastWord.slice(-1).toLowerCase() ); if (matchIndex === -1) break; // 将匹配元素加入结果并从候选池移除 result.push(remaining.splice(matchIndex, 1)[0]); } // 处理无法衔接的剩余元素 if (remaining.length > 0) { result.push(...remaining); } return result; }; console.log(reorderArr(array)); // 输出: ["team", "moist", "token"]
额外优化
- 加入大小写兼容处理,避免因字母大小写导致匹配失败
- 用
remaining数组精准跟踪未使用元素,避免重复添加 - 处理了无法全部衔接的场景,剩余元素会直接追加到结果末尾
内容的提问来源于stack exchange,提问作者code.cycling
相关产品推荐
相关产品推荐

