MST
星途 面试题库

面试题:TypeScript基于string类型实现高效文本解析

给定一个复杂格式的文本字符串,格式类似于'key1:value1;key2:value2;key3:value3',其中value可能包含';'字符(但用转义符'\'转义,如'key4:va\;lue4')。请在TypeScript中编写一个高效的解析函数,将该字符串解析为一个对象,例如`{ key1: 'value1', key2: 'value2', key3: 'value3', key4: 'va;lue4' }`。要求详细说明解析过程中如何处理转义字符、边界情况以及优化思路。
45.0万 热度难度
前端开发TypeScript

知识考点

AI 面试

面试题答案

一键面试
function parseComplexString(str: string): { [key: string]: string } {
    const result: { [key: string]: string } = {};
    let key = '';
    let value = '';
    let inValue = false;
    let escaped = false;

    for (let i = 0; i < str.length; i++) {
        const char = str[i];

        if (!inValue) {
            if (char === ':') {
                inValue = true;
            } else {
                key += char;
            }
        } else {
            if (escaped) {
                value += char;
                escaped = false;
            } else {
                if (char === '\\') {
                    escaped = true;
                } else if (char === ';') {
                    result[key] = value;
                    key = '';
                    value = '';
                    inValue = false;
                } else {
                    value += char;
                }
            }
        }
    }

    // 处理最后一组键值对
    if (key && value) {
        result[key] = value;
    }

    return result;
}

解析过程

  1. 初始化变量

    • result 用于存储最终解析的对象。
    • keyvalue 分别用于临时存储当前解析的键和值。
    • inValue 标记当前是否正在解析值。
    • escaped 标记当前字符是否是转义字符后的字符。
  2. 遍历字符串

    • !inValue 时,即正在解析键,遇到 : 则开始解析值,将 inValue 设为 true,否则继续累加字符到 key
    • inValue 时:
      • 如果 escapedtrue,则将当前字符累加到 value 并将 escaped 设为 false
      • 如果当前字符为 \,则将 escaped 设为 true
      • 如果当前字符为 ;escapedfalse,则表示一组键值对结束,将当前 keyvalue 存入 result,并重置 keyvalue,将 inValue 设为 false
      • 其他情况,直接将字符累加到 value
  3. 处理最后一组键值对:遍历结束后,如果 keyvalue 都有值,则将最后一组键值对存入 result

边界情况处理

  1. 字符串结尾没有 ;:在遍历结束后通过检查 keyvalue 是否都有值,确保最后一组键值对也能正确解析。
  2. 空字符串:直接返回空对象 {},若传入的 str 为空,上述代码逻辑会直接返回空对象,因为没有字符可解析。

优化思路

  1. 减少内存分配:尽量减少中间变量的创建和销毁,这里通过复用 keyvalue 等变量来减少不必要的内存开销。
  2. 避免多次遍历:采用一次遍历的方式,在遍历过程中直接完成解析,而不是先进行预处理再解析,提高效率。