如何合并数组中长度小于指定值的相邻字符串(首词独立)
短词与后续单词合并的实现方案
问题说明
需要将数组中长度小于4的单词与相邻的下一个词合并,且第一个单词始终保持独立,示例如下:
- 输入:
['about', 'my', 'projects'],输出:['about', 'my projects'] - 输入:
['something','for','something','for'],输出:['something','for something','for']
原实现中通过string.split(" ")拆分单词数组后,编写的循环出现Uncaught TypeError: Cannot read properties of undefined (reading 'length')错误,原循环代码:
for (let i = 0; i <= words.length; i++) { if (words[1 + i].length <= 3) { const joinedWords = words[1] + " " + words[1 + i]; formattedWords.push(joinedWords); } }
错误原因
- 索引越界:循环条件
i <= words.length会导致当i等于数组长度时,1+i超出数组最大索引范围,此时访问words[1+i]会得到undefined,读取其length属性就会触发报错。 - 逻辑错误:固定使用
words[1]进行拼接,无法遍历处理所有需要合并的短词,也没有跳过已经被合并的元素,逻辑完全不符合需求。
正确实现代码
可以通过遍历数组时判断当前元素(从第二个开始)是否为短词,若满足条件则与下一个单词合并,同时跳过已处理的下一个元素:
function mergeShortWords(words) { const result = []; // 第一个单词直接加入结果,确保独立 if (words.length > 0) { result.push(words[0]); } let i = 1; while (i < words.length) { // 判断当前单词是否是短词,且存在下一个单词可合并 if (words[i].length <= 3 && i + 1 < words.length) { // 合并短词与下一个单词 result.push(`${words[i]} ${words[i + 1]}`); // 跳过已合并的下一个单词 i += 2; } else { // 不满足合并条件,直接加入当前单词 result.push(words[i]); i += 1; } } return result; } // 测试示例 console.log(mergeShortWords(['about', 'my', 'projects'])); // 输出: ['about', 'my projects'] console.log(mergeShortWords(['something','for','something','for'])); // 输出: ['something','for something','for']
代码逻辑说明
- 首先将第一个单词直接加入结果数组,确保其始终独立。
- 从索引1开始遍历数组:
- 若当前单词长度≤3且存在下一个单词,则合并两者并加入结果,同时索引+2跳过已处理的下一个单词。
- 若不满足合并条件,直接将当前单词加入结果,索引+1继续遍历。
内容的提问来源于stack exchange,提问作者Oliver
相关产品推荐
相关产品推荐

