如何扁平化带有大量转义字符的字符串化嵌套数组?
如何高效扁平化深度嵌套的字符串化数组并移除转义字符?
你的需求是把多层转义嵌套的字符串化数组,转换成一维数组并清除所有转义字符,最终得到["foo"]这类结果。下面是两种高效实现方案,优先推荐原生API组合的方式:
最优方案:循环解析+原生扁平化
利用JSON.parse自动处理转义的特性,逐层解开嵌套的字符串包裹,再用flat(Infinity)一键扁平化任意深度的数组。原生API的性能远高于手动处理转义,适合大型字符串场景。
const original = "[\"[\"[\\\"[\\\\\"[\\\\\\\\\"[\\\\\\\\\\\\\\\"[\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"[\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"[\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"[\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"foo\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"]\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"]\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"]\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"]\\\\\\\\\\\\\\\"]\\\\\\\"]\\\"]\"]\"]\"]"; function flattenEscapedNestedArray(str) { let current = str; // 循环解析直到拿到数组类型 while (typeof current === 'string') { try { current = JSON.parse(current); } catch (err) { break; // 解析失败时终止,避免死循环 } } // 扁平化任意深度的嵌套数组 return current.flat(Infinity); } const result = flattenEscapedNestedArray(original); console.log(result); // 输出 ["foo"]
方案说明
- 转义处理:
JSON.parse会自动识别并处理字符串中的转义字符,每次解析都会解开一层嵌套的字符串包裹,直到得到真正的数组结构。 - 扁平化:
flat(Infinity)是ES2019新增的API,能直接将任意深度的嵌套数组扁平化为一维数组,代码简洁且性能优化到位。 - 容错处理:添加
try-catch防止输入字符串格式不合法导致的解析错误,避免程序崩溃。
备选方案:递归解析(自定义场景)
如果需要对每一层解析结果做自定义处理,递归方式更灵活。但要注意极深嵌套可能触发调用栈溢出(多数现代引擎已优化栈深度,一般场景无需担心)。
function parseAndFlatten(str) { // 非字符串类型直接处理 if (typeof str !== 'string') { return Array.isArray(str) ? str.flat(Infinity) : [str]; } try { const parsed = JSON.parse(str); return parseAndFlatten(parsed); } catch (err) { // 解析失败则将当前字符串作为数组元素返回 return [str]; } } const result = parseAndFlatten(original); console.log(result); // 输出 ["foo"]
方案说明
递归会逐层尝试解析字符串,直到无法解析为止,再对最终得到的数组做扁平化处理。适合需要在解析过程中插入自定义逻辑的场景,比如过滤特定元素、修改值等。
内容的提问来源于stack exchange,提问作者Ty Sabs
相关产品推荐
相关产品推荐

