首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用数组元素作为坐标访问对象

使用数组元素作为坐标访问对象
EN

Stack Overflow用户
提问于 2020-08-07 02:55:31
回答 4查看 79关注 0票数 0

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

代码语言:javascript
复制
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;
}

我尝试了以下几点:

代码语言:javascript
复制
function accessAndModify(obj, coord, ewVal) {
    try {
        [obj, ...coord].reduce((x, y) => x[y]) = newVal;
    } catch (e) {
        return false;
    }
}

但是它产生了这样的错误: ReferenceError:赋值中无效的左侧.

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2020-08-07 03:03:43

代码的问题是,您在对象层次结构中遍历得太远了,当您真正想要obj['bar']['baz']时,您在obj['bar']上返回值,这样您就可以将该对象的baz元素设置为新的值。如果您在代码运行得更早就停止了reduce元素:

代码语言:javascript
复制
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);

票数 1
EN

Stack Overflow用户

发布于 2020-08-07 03:00:30

您需要将reduce()的结果分配给一个对象并返回res

代码语言:javascript
复制
function accessAndModify(obj, coord, newVal) {
    try {
        const res = [obj, ...coord].reduce((x, y) => x[y]) = newVal;
        return res;
    } catch (e) {
        return false;
    }
}

或者直接从reduce()返回结果。

代码语言:javascript
复制
function accessAndModify(obj, coord, newVal) {
    try {
        return [obj, ...coord].reduce((x, y) => x[y]) = newVal;
    } catch (e) {
        return false;
    }
}
票数 0
EN

Stack Overflow用户

发布于 2020-08-07 03:02:36

您需要在obj中继续获取下一个属性,但是一旦yu位于最后一个属性,您需要在返回它之前设置它,这样您就可以修改对象属性而不是原语了。你可以这样做:

代码语言:javascript
复制
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);

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63294525

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档