UNPKG

make-object

Version:

MakeObject - A complete useless library for doing something you never wanted to do using a method that is poorly thought out.

66 lines (60 loc) 1.71 kB
// makeObject - converts string into the equivalent object // Ex: // Turns "x.y.z" into {x: {y: {z: value }}} // Turns "x[0][1].z" into {x: [[null, {z: value }]]} // Turns "[0][1]" into [[null, value ]] module.exports = (function() { function getArrayTokens(levelName, tokens) { var levelTokens = levelName.split('['); var tokenCount = levelTokens.length; while (tokenCount-- > 1) { tokens.unshift(levelTokens[tokenCount]); } var firstToken = levelTokens[0]; return firstToken.length === 0 ? tokens.shift() : firstToken; } function isArrayToken(token) { return token[token.length - 1] === ']'; } return function(str, val, targetObj) { var currLevel = null; var prevLevel = null; var tokens = str.split('.'); var currToken, prevToken; while (tokens.length) { currToken = tokens.shift(); currToken = getArrayTokens(currToken, tokens); if (isArrayToken(currToken)) { currToken = parseInt(currToken, 10); if (prevLevel) { if (!prevLevel[prevToken]) { currLevel = prevLevel[prevToken] = []; } else { currLevel = prevLevel[prevToken]; } } else { currLevel = targetObj || (targetObj = []); } if (!tokens.length) { currLevel[currToken] = val; } } else { if (prevLevel) { if (!prevLevel[prevToken]) { currLevel = prevLevel[prevToken] = {}; } else { currLevel = prevLevel[prevToken]; } } else { currLevel = targetObj || (targetObj = {}); } if (!tokens.length) { currLevel[currToken] = val; } } prevToken = currToken; prevLevel = currLevel; } return targetObj; }; })();