UNPKG

es-toolkit

Version:

A state-of-the-art, high-performance JavaScript utility library with a small bundle size and strong type annotations.

67 lines (66 loc) 1.99 kB
import { toKey } from "../_internal/toKey.mjs"; import { toString } from "./toString.mjs"; //#region src/compat/util/toPath.ts /** * Converts a deep key string into an array of path segments. * * This function takes a string representing a deep key (e.g., 'a.b.c' or 'a[b][c]') and breaks it down into an array of strings, each representing a segment of the path. * * @param deepKey - The deep key string to convert. * @returns An array of strings, each representing a segment of the path. * * Examples: * * toPath('a.b.c') // Returns ['a', 'b', 'c'] * toPath('a[b][c]') // Returns ['a', 'b', 'c'] * toPath('.a.b.c') // Returns ['', 'a', 'b', 'c'] * toPath('a["b.c"].d') // Returns ['a', 'b.c', 'd'] * toPath('') // Returns [] * toPath('.a[b].c.d[e]["f.g"].h') // Returns ['', 'a', 'b', 'c', 'd', 'e', 'f.g', 'h'] */ function toPath(deepKey) { if (Array.isArray(deepKey)) return deepKey.map(toKey); if (typeof deepKey === "symbol") return [deepKey]; deepKey = toString(deepKey); const result = []; const length = deepKey.length; if (length === 0) return result; let index = 0; let key = ""; let quoteChar = ""; let bracket = false; if (deepKey.charCodeAt(0) === 46) result.push(""); while (index < length) { const char = deepKey[index]; if (quoteChar) if (char === "\\" && index + 1 < length) { index++; key += deepKey[index]; } else if (char === quoteChar) quoteChar = ""; else key += char; else if (bracket) if (char === "\"" || char === "'") quoteChar = char; else if (char === "]") { bracket = false; result.push(key); key = ""; } else key += char; else if (char === "[") { bracket = true; if (key) { result.push(key); key = ""; } } else if (char === ".") { if (key) { result.push(key); key = ""; } const next = deepKey[index + 1]; if (next === void 0 || next === ".") result.push(""); } else key += char; index++; } if (key) result.push(key); return result; } //#endregion export { toPath };