You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取含多行字符串的数组中的最长行?

如何获取混合单行/多行字符串数组中的最长行长度?

给定如下包含单行字符串与多行模板字符串的数组:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 11:03:24