如何获取含多行字符串的数组中的最长行?
如何获取混合单行/多行字符串数组中的最长行长度?
给定如下包含单行字符串与多行模板字符串的数组:
const arrayOfString = [ 'Hello!', `The quick brown fox jumps over the lazy dog`, 'And then went home' ];
我需要获取该数组中的最长行长度,目前已有如下实现,但担心这是性能最差的方案:
let longestRow = 0; arrayOfString.forEach((str) => { const splitStr = str.split('\n'); splitStr.forEach((str) => { const strLen = str.trim().length; if (strLen > longestRow) { console.log(`>${str}<`, strLen); longestRow = strLen; } }) });
另外,多行模板字符串存在缩进问题,必须用trim()才能得到字符串的真实长度,预期最终longestRow的值为19(因为'The quick brown fox'是最长的字符串)。
优化方案解析
你的现有实现逻辑没问题,但确实可以通过更简洁或高效的方式重构,同时解决模板字符串的缩进问题:
1. 简洁链式调用写法
利用数组的flatMap、map和reduce方法,把嵌套遍历改成链式操作,代码更直观易读:
const longestRow = arrayOfString .flatMap(str => str.split('\n')) // 将所有字符串按换行分割后合并为一维数组 .map(line => line.trim().length) // 计算每行去空白后的长度 .reduce((maxLen, currentLen) => Math.max(maxLen, currentLen), 0); // 找出最大值 console.log(longestRow); // 输出19
2. 极致性能遍历写法
如果处理超大规模数组,想要避免创建中间数组,可以用for...of做单层嵌套遍历,减少内存开销:
let longestRow = 0; for (const str of arrayOfString) { const lines = str.split('\n'); for (const line of lines) { const currentLen = line.trim().length; if (currentLen > longestRow) { longestRow = currentLen; } } } console.log(longestRow); // 输出19
关于模板字符串的缩进问题
多行模板字符串会保留编写时的前置缩进(也就是那些多余空格),所以trim()是必须的,这样才能得到内容的真实长度——除非你能提前保证模板字符串里的每行没有额外缩进。
性能说明
你的原实现和上面两种写法的性能差距极小,只有在处理十万级以上规模的数组时才会显现差异。日常开发中,链式调用的写法更推荐,因为可读性更强;如果追求极致性能,for...of的写法更合适。
内容的提问来源于stack exchange,提问作者Mike K
相关产品推荐
相关产品推荐

