У меня есть массив неизвестной длины, который определяет путь к содержимому, которое я хочу изменить в объекте.
Это то, чего я хочу.
let updatedContent = "Hello World!";
let myArray = ["layer1","layer2","layer3"];
myObject["layer1"]["layer2"]["layer3"] = updatedContent;
Моя проблема в том, что myArray имеет неизвестную длину. Каков наилучший способ обновить значение в объекте?
У меня есть файловая система, в которой пользователи могут добавлять/изменять файлы. layer1, layer2, ect представляют имена папок, которые создал пользователь. myArray на самом деле является глобальной переменной, которая отслеживает, где находится пользователь в файловой системе. Надеюсь, это прояснит мою ситуацию.
Вот уродливый подход с использованием рекурсивной функции. Идея состоит в последовательном извлечении вложенных свойств, рекурсивном вызове функции с текущим уровнем до конца массива:
function changeObject(obj, arr, content, index = 0) {
if (index < arr.length - 1) {
changeObject(obj[arr[index]], arr, content, ++index);
} else {
obj[arr[index]] = content;
}
};
const myObject = {
layer1: {
layer2: {
layer3: "foo"
}
}
};
let updatedContent = "Hello World!";
let myArray = ["layer1", "layer2", "layer3"];
myObject["layer1"]["layer2"]["layer3"] = updatedContent;
changeObject(myObject, myArray, updatedContent);
console.info(myObject);
В массиве
["layer1","layer2","layer3"]
находятся просто строки, не связанные с объектом.