首页 > 解决方案 > 使用数组元素作为坐标来访问对象

问题描述

我正在尝试实现一个函数,该函数使用数组元素来访问特定对象属性,以应对如下情况:

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: Invalid left-hand side in assignment。

标签: javascriptarrays

解决方案


您的代码的问题是您在对象层次结构中向下遍历太远,并且您的 reduce 正在返回obj['bar']['baz']您实际需要的值,obj['bar']以便您可以baz将该对象的元素设置为新值。如果您尽快停止减少一个元素,您的代码将起作用:

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);


推荐阅读