Created
June 14, 2021 20:29
-
-
Save matiaslopezd/52acc599ea4e207a1c11d1d8feca3dbd to your computer and use it in GitHub Desktop.
Set deep data in object
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/*! | |
* Add items to an object at a specific path | |
* (c) 2021 Chris Ferdinandi, MIT License, https://gomakethings.com | |
* @param {Object} obj The object | |
* @param {String|Array} path The path to assign the value to | |
* @param {*} val The value to assign | |
*/ | |
Object.stringSet = (obj, path, val) => { | |
/** | |
* If the path is a string, convert it to an array | |
* @param {String|Array} path The path | |
* @return {Array} The path array | |
*/ | |
function stringToPath (path) { | |
// If the path isn't a string, return it | |
if (typeof path !== 'string') return path; | |
// Create new array | |
let output = []; | |
// Split to an array with dot notation | |
path.split('.').forEach(function (item) { | |
// Split to an array with bracket notation | |
item.split(/\[([^}]+)\]/g).forEach(function (key) { | |
// Push to the new array | |
if (key.length > 0) { | |
output.push(key); | |
} | |
}); | |
}); | |
return output; | |
} | |
// Convert the path to an array if not already | |
path = stringToPath(path); | |
// Cache the path length and current spot in the object | |
let length = path.length; | |
let current = obj; | |
// Loop through the path | |
path.forEach(function (key, index) { | |
// Check if the assigned key should be an array | |
let isArray = key.slice(-2) === '[]'; | |
// If so, get the true key name by removing the trailing [] | |
key = isArray ? key.slice(0, -2) : key; | |
// If the key should be an array and isn't, create an array | |
if (isArray && !Array.isArray(current[key])) { | |
current[key] = []; | |
} | |
// If this is the last item in the loop, assign the value | |
if (index === length -1) { | |
// If it's an array, push the value | |
// Otherwise, assign it | |
if (isArray) { | |
current[key].push(val); | |
} else { | |
current[key] = val; | |
} | |
} | |
// Otherwise, update the current place in the object | |
else { | |
// If the key doesn't exist, create it | |
if (!current[key]) { | |
current[key] = {}; | |
} | |
// Update the current place in the object | |
current = current[key]; | |
} | |
}); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment