Intended output: { children: { Display: { children: { … value: 2 } } } }
Real output: { children: {}, Display: {}, … value: 2 }
Code:
// Load default settings
let defaultSettings;
load("/assets/json/default-settings.json", 'json', function(defset) {
defaultSettings = defset;
// Create custom settings
if(!Object.keys(localStorage).includes('settings')) {
setLs('settings', JSON.stringify({}));
};
customiseSetting('Display/UI/Distance', 2)
});
function settingURL(url) {
return('children/' + url.split('/').join('/children/') + '/value');
}
function customiseSetting(url, value) {
url = settingURL(url);
// Split the string by '/' and use reduce to access the nested properties
const newSettings = url.split('/').reduce(function(accumulator, val, index, array) {
// If the object does not have the current component as a property, create an empty object for it
// If the current component is the last one, assign the value
if (index == array.length - 1) {
accumulator[val] = value;
} else if (!accumulator.hasOwnProperty(val)) {
accumulator[val] = {}; // update the accumulator object
}
log([accumulator, val, index, array])
// Return the updated object
return(accumulator);
}, JSON.parse(ls('settings')));
log(newSettings);
setLs('settings', JSON.stringify(newSettings));
}
I’ve been trying unsuccessfully for several days to fix to what must be a simple error. I’ve looked over it myself, but I can’t find the cause of the bug. I asked Bing, which usually helps, but it was unhelpful. So I’m sorry to be bothering you, but if you could help me solve this problem, I would really appreciate it.
EDIT: I fixed my code by using a recursive function as follows:
function customiseSetting(url, value) {
url = settingURL(url).split('/');
let newSettings;
function recursiveSet(object, list, index, setTo) {
// If the current component is the last one, assign the value
if(index == list.length - 1) {
object[list[index]] = setTo;
return(object);
} else {
// Check if it already contains the value
if(object.hasOwnProperty(list[index])) {
object[list[index]] = recursiveSet(object[list[index]], list, index + 1, setTo);
} else {
object[list[index]] = recursiveSet({}, list, index + 1, setTo);
}
return(object);
}
};
newSettings = recursiveSet(JSON.parse(ls('settings')), url, 0, value);
log(newSettings);
setLs('settings', JSON.stringify(newSettings));
}
Welcome to the main community in programming.dev! Feel free to post anything relating to programming here!
Cross posting is strongly encouraged in the instance. If you feel your post or another person’s post makes sense in another community cross post into it.
Hope you enjoy the instance!
Follow the wormhole through a path of communities !webdev@programming.dev
What does i < mean in line 3 of your answer?
Lemmy’s code formatter has a bug where it escapes the less than symbol <