Skip to content

Instantly share code, notes, and snippets.

@matiaslopezd
Created June 14, 2021 20:29
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save matiaslopezd/52acc599ea4e207a1c11d1d8feca3dbd to your computer and use it in GitHub Desktop.
Save matiaslopezd/52acc599ea4e207a1c11d1d8feca3dbd to your computer and use it in GitHub Desktop.
Set deep data in object
/*!
* 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