You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
53 lines
1.1 KiB
53 lines
1.1 KiB
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
|
|
|