diff --git a/lib/parse.js b/lib/parse.js index 549de82e..d99d47ac 100644 --- a/lib/parse.js +++ b/lib/parse.js @@ -227,11 +227,8 @@ var splitKeyIntoSegments = function splitKeyIntoSegments(givenKey, options) { return [key]; } - var brackets = /(\[[^[\]]*])/; - var child = /(\[[^[\]]*])/g; - - var segment = brackets.exec(key); - var parent = segment ? key.slice(0, segment.index) : key; + var segmentStart = key.indexOf('['); + var parent = segmentStart > -1 ? key.slice(0, segmentStart) : key; var keys = []; @@ -246,25 +243,40 @@ var splitKeyIntoSegments = function splitKeyIntoSegments(givenKey, options) { } var i = 0; - while ((segment = child.exec(key)) !== null && i < options.depth) { + var segmentEnd = segmentStart; + while (segmentEnd > -1 && i < options.depth) { + var bracketDepth = 1; + var j = segmentEnd + 1; + while (j < key.length && bracketDepth > 0) { + if (key.charAt(j) === '[') { + bracketDepth += 1; + } else if (key.charAt(j) === ']') { + bracketDepth -= 1; + } + + j += 1; + } + + var segment = bracketDepth === 0 ? key.slice(segmentEnd, j) : '[' + key.slice(segmentEnd) + ']'; i += 1; - var segmentContent = segment[1].slice(1, -1); + var segmentContent = segment.slice(1, -1); if (!options.plainObjects && has.call(Object.prototype, segmentContent)) { if (!options.allowPrototypes) { return; } } - keys[keys.length] = segment[1]; + keys[keys.length] = segment; + segmentEnd = bracketDepth === 0 ? key.indexOf('[', j) : -1; } - if (segment) { + if (segmentEnd > -1) { if (options.strictDepth === true) { throw new RangeError('Input depth exceeded depth option of ' + options.depth + ' and strictDepth is true'); } - keys[keys.length] = '[' + key.slice(segment.index) + ']'; + keys[keys.length] = '[' + key.slice(segmentEnd) + ']'; } return keys;