Spaces:
Sleeping
Sleeping
var reFirstKey = /^[^\[]*/ | |
var reDigitPath = /^\[(\d+)\]/ | |
var reNormalPath = /^\[([^\]]+)\]/ | |
function parsePath (key) { | |
function failure () { | |
return [{ type: 'object', key: key, last: true }] | |
} | |
var firstKey = reFirstKey.exec(key)[0] | |
if (!firstKey) return failure() | |
var len = key.length | |
var pos = firstKey.length | |
var tail = { type: 'object', key: firstKey } | |
var steps = [tail] | |
while (pos < len) { | |
var m | |
if (key[pos] === '[' && key[pos + 1] === ']') { | |
pos += 2 | |
tail.append = true | |
if (pos !== len) return failure() | |
continue | |
} | |
m = reDigitPath.exec(key.substring(pos)) | |
if (m !== null) { | |
pos += m[0].length | |
tail.nextType = 'array' | |
tail = { type: 'array', key: parseInt(m[1], 10) } | |
steps.push(tail) | |
continue | |
} | |
m = reNormalPath.exec(key.substring(pos)) | |
if (m !== null) { | |
pos += m[0].length | |
tail.nextType = 'object' | |
tail = { type: 'object', key: m[1] } | |
steps.push(tail) | |
continue | |
} | |
return failure() | |
} | |
tail.last = true | |
return steps | |
} | |
module.exports = parsePath | |