首页 > 解决方案 > 引用对象的键作为变量 - js

问题描述

有没有办法将对象的键作为变量引用,然后更改其值?我正在尝试这个

const obj = {
  x: {
    y: {
      z: 'test'
    }
  }
}

const func = () => {
  let root = obj['x'];
  root = 'test 2';
}

func();

console.log(obj);

我正在尝试解决这个问题,因为我正在编写一个递归函数,以便将 root 更改为更像 obj['x']['y']

标签: javascript

解决方案


如果我正确理解您的问题,答案可能是“并非没有做非常奇怪的事情”。我相信你问的是这个。鉴于:

const obj = {
  x: {
    y: {
      z: 'test'
    }
  }
}

您想将obj.x(等效地obj['x'])存储到一个变量中,这样分配给该变量实际上会改变xobject 的字段obj。现在你不能那样做。进行绑定后:

let root = obj.x

然后重新分配root根本不会改变objroot是一个不同的变量obj。画个图,会有帮助的。但是,如果您这样做,root本质上是一个指向so 的指针:obj.x

root.y = 'test 2'

比这确实发生了变异obj.x.y

但是,请注意,您不能分配obj.x给一个变量,然后使用该变量来改变x. obj您只能在 WITHIN 中更改字段obj.x。例如,JavaScript 不具备为 C++ 之类的东西取别名(或生成左值)的能力。

如果您真的想更新 的x属性,obj那么您应该只将字符串x放入如下变量中:

root = 'x'

那么你可以这样做:

obj[root] = 'a new value for obj.x'

这会发生变异obj.x。但是请记住,您不能先评估obj.x然后使用该结果来 mutate obj.x。好吧,我的意思是,并非没有做一些像这样非常讨厌的事情:

root = 'obj.x';
eval(`${root} = 'a new value for obj.x';`);

但是不要。

顺便说一句,如果obj也是一个变量,那么你可以这样做:

receiver = obj;
prop = 'x';
Reflect.set(receiver, prop, 'the new value')

希望我猜到你想做什么。无论如何,也许这个答案会给出一些想法。


推荐阅读