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.
		
		
		
		
		
			
		
			
				
					48 lines
				
				1.4 KiB
			
		
		
			
		
	
	
					48 lines
				
				1.4 KiB
			| 
											3 years ago
										 | 'use strict'; | ||
|  | 
 | ||
|  | module.exports = function stringToParts(str) { | ||
|  |   const result = []; | ||
|  | 
 | ||
|  |   let curPropertyName = ''; | ||
|  |   let state = 'DEFAULT'; | ||
|  |   for (let i = 0; i < str.length; ++i) { | ||
|  |     // Fall back to treating as property name rather than bracket notation if
 | ||
|  |     // square brackets contains something other than a number.
 | ||
|  |     if (state === 'IN_SQUARE_BRACKETS' && !/\d/.test(str[i]) && str[i] !== ']') { | ||
|  |       state = 'DEFAULT'; | ||
|  |       curPropertyName = result[result.length - 1] + '[' + curPropertyName; | ||
|  |       result.splice(result.length - 1, 1); | ||
|  |     } | ||
|  | 
 | ||
|  |     if (str[i] === '[') { | ||
|  |       if (state !== 'IMMEDIATELY_AFTER_SQUARE_BRACKETS') { | ||
|  |         result.push(curPropertyName); | ||
|  |         curPropertyName = ''; | ||
|  |       } | ||
|  |       state = 'IN_SQUARE_BRACKETS'; | ||
|  |     } else if (str[i] === ']') { | ||
|  |       if (state === 'IN_SQUARE_BRACKETS') { | ||
|  |         state = 'IMMEDIATELY_AFTER_SQUARE_BRACKETS'; | ||
|  |         result.push(curPropertyName); | ||
|  |         curPropertyName = ''; | ||
|  |       } else { | ||
|  |         state = 'DEFAULT'; | ||
|  |         curPropertyName += str[i]; | ||
|  |       } | ||
|  |     } else if (str[i] === '.') { | ||
|  |       if (state !== 'IMMEDIATELY_AFTER_SQUARE_BRACKETS') { | ||
|  |         result.push(curPropertyName); | ||
|  |         curPropertyName = ''; | ||
|  |       } | ||
|  |       state = 'DEFAULT'; | ||
|  |     } else { | ||
|  |       curPropertyName += str[i]; | ||
|  |     } | ||
|  |   } | ||
|  | 
 | ||
|  |   if (state !== 'IMMEDIATELY_AFTER_SQUARE_BRACKETS') { | ||
|  |     result.push(curPropertyName); | ||
|  |   } | ||
|  | 
 | ||
|  |   return result; | ||
|  | }; |