我正在尝试实现一个函数,该函数使用数组元素访问特定对象属性,以满足以下情况:
let foo = {
bar:{
baz:"oldVal",
}
}
let coodinates = ["bar", "baz"]
function accessAndModify(obj, coord, newVal){
//should do this: obj[coord[0]][coord[1]]...[coord[coord.length - 1]] = newVal;
}我尝试了以下几点:
function accessAndModify(obj, coord, ewVal) {
try {
[obj, ...coord].reduce((x, y) => x[y]) = newVal;
} catch (e) {
return false;
}
}但是它产生了这样的错误: ReferenceError:赋值中无效的左侧.
发布于 2020-08-07 03:03:43
代码的问题是,您在对象层次结构中遍历得太远了,当您真正想要obj['bar']['baz']时,您在obj['bar']上返回值,这样您就可以将该对象的baz元素设置为新的值。如果您在代码运行得更早就停止了reduce元素:
let foo = {
bar: {
baz: "oldVal",
}
}
let coordinates = ["bar", "baz"]
function accessAndModify(obj, coord, newVal) {
try {
[obj, ...coord.slice(0, -1)].reduce((x, y) => x[y])[coord[coord.length - 1]] = newVal;
} catch (e) {
return false;
}
}
console.log(foo);
accessAndModify(foo, coordinates, 'newVal');
console.log(foo);
发布于 2020-08-07 03:00:30
您需要将reduce()的结果分配给一个对象并返回res。
function accessAndModify(obj, coord, newVal) {
try {
const res = [obj, ...coord].reduce((x, y) => x[y]) = newVal;
return res;
} catch (e) {
return false;
}
}或者直接从reduce()返回结果。
function accessAndModify(obj, coord, newVal) {
try {
return [obj, ...coord].reduce((x, y) => x[y]) = newVal;
} catch (e) {
return false;
}
}发布于 2020-08-07 03:02:36
您需要在obj中继续获取下一个属性,但是一旦yu位于最后一个属性,您需要在返回它之前设置它,这样您就可以修改对象属性而不是原语了。你可以这样做:
let foo = {
bar:{
baz:"oldVal",
}
}
let coordinates = ["bar", "baz"]
function accessAndModify(obj, coord, newVal) {
try {
coord.reduce((carry, current, index) => {
if (index === coord.length - 1) {
carry[current] = newVal;
}
return carry[current];
}, obj);
} catch (e) {
return false;
}
}
accessAndModify(foo, coordinates, 'newVal');
console.log(foo);
https://stackoverflow.com/questions/63294525
复制相似问题