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.
		
		
		
		
		
			
		
			
				
					54 lines
				
				1.1 KiB
			
		
		
			
		
	
	
					54 lines
				
				1.1 KiB
			| 
											3 years ago
										 | 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 |