Reduce принимает начальное начальное значение в качестве второго аргумента после функции обратного вызова, поэтому вам не нужно создавать новый массив с начальным объектом, вместо этого установите начальное значение для объекта.
Затем, прежде чем использовать сокращение coord
, удалите последний элемент из координаты (используя .pop()
) и поместите его в переменную с именем last
, таким образом вы получите последний объект, чтобы вы могли обновить его значение, если если вы не извлекли значение, то reduce вернет строковое значение, которое вы пытаетесь обновить, а не ссылку на объект.
См. пример ниже:
let foo = {
bar: {
baz: "oldVal",
}
}
let coordinates = ["bar", "baz"];
function accessAndModify(obj, coord, newVal) {
try {
const last = coord.pop(); // coord changes and last is assigned last value in array
const foundObj = coord.reduce((x, y) => x[y], obj);
foundObj[last] = newVal;
} catch (e) {
return false;
}
}
accessAndModify(foo, coordinates, "newVal");
console.log(foo);