【问题标题】:referencing an object's key as a variable - js将对象的键作为变量引用 - js
【发布时间】:2018-11-15 06:20:24
【问题描述】:

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

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

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

func();

console.log(obj);

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

【问题讨论】:

  • const key = 'x'; obj[key] = 'test 2';
  • 你能说明你想做什么吗?更重要的是展示一个你想要的结果的例子?
  • 我想弄清楚为什么这不起作用stackoverflow.com/questions/53308903/… 所以我将这个问题的一部分简化为一个新帖子
  • 我想这个问题之前一定有人问过,但是在搜索 S.O. 的两分钟内。我找不到副本。有人能找到骗子吗?这似乎是一个超级常见的问题,答案相对简单......
  • @RayToal 某处有一个规范的副本,但也出现空白。

标签: javascript


【解决方案1】:

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

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

您想将obj.x(相当于obj['x'])存储到一个变量中,这样分配给该变量实际上会改变对象objx 字段。现在你不能这样做。绑定后:

let root = obj.x

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

root.y = 'test 2'

比这确实变异obj.x.y

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

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

root = 'x'

那么你可以这样做:

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

这将改变obj.x。但请记住,您不能先评估obj.x,然后使用该结果来改变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')

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

【讨论】:

【解决方案2】:
const func = () => {
  let root = obj['x'];
  root = 'test 2';
}

这会将变量root 重新分配给一个新值,并且不会影响对象。而是直接分配给对象:

obj['x'] = 'test 2'

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

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

func();

console.log(obj);

或者您可以通过root 变量更改键的值:

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

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

func();

console.log(obj);

【讨论】:

  • 是的,但是如果我要创建一个像stackoverflow.com/questions/53308903/… 这样的递归函数,我需要一个变量保留并设置它的父级,例如 obj['x'] => obj['x'][ 'y'] 那不行吗?
  • @totalnoob 我不明白您所说的“我需要一个变量保留并设置其父级”是什么意思。重新分配变量只会更改该变量的值,不会影响其先前值的任何内容。另一方面,通过变量分配给键将影响对同一对象的所有其他引用。
  • @totalnoob 这些副作用是许多难以发现的错误的根源。我建议你重新考虑你的方法。
  • 我试图创建一个遍历数组并在对象中创建嵌套值的递归函数。该函数需要知道它所在的根,并且如果数组中有多个项目,则每次都需要更改根变量。
  • 所以如果数组是 ['x','y','z'],它会递归地创建一个像本文中的对象映射,并且 root 将是 obj['x '] => obj['x']['y'] => obj['x']['y']['z']
【解决方案3】:

只需传递值

常量 obj = { x: { 是:{ z: '测试' } } }

删除 Object.assign(obj, {newKey: obj.oldKey }).oldKey;

【讨论】:

    猜你喜欢
    • 2013-10-11
    • 1970-01-01
    • 2019-07-16
    • 1970-01-01
    • 2011-03-21
    • 1970-01-01
    • 1970-01-01
    • 2020-06-20
    • 2021-07-10
    相关资源
    最近更新 更多