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
'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; |
|
}; |