【问题标题】:JS object destructuring without defining variable names [duplicate]JS对象解构而不定义变量名[重复]
【发布时间】:2018-06-30 07:59:18
【问题描述】:

在 ES6 JS 中解构对象时,您可以使用 { a, b } 语法从该对象创建新变量,分别称为 ab。但是,据我所知,没有办法让对象的键自动创建具有这些名称的本地范围变量。在下面的示例中,我希望能够使用const {} = args; 的假设伪代码,它会自动生成const aconst b

const bar = { a: 'apple', b: 'ball' };

const foo = (args) => {
  const { a, b } = args;
  console.log(a, b); // Great!
  const {} = args;   // I am aware this isn't valid syntax...
  console.log(a, b)  // Because of course, it doesn't work.
};

foo(bar);

原因纯粹是因为,在这个 MCVE 之外,我实际上使用了一个带有几十个键的 massive 对象,并且我想将其中的某些值传递到承诺链。我当然可以使用{ a: args.a, b: args.b },但我正在尝试找到最短、最干净的方法。我想我真正想要的是 PHP 的 extract()-like 语法,但在 ES6 JS 中。

这可能吗?

Ps,我知道如果对象的内容不受信任,这可能会被视为一个非常糟糕的主意。

Pps。我正在测试的环境是 Node 7.9.0

【问题讨论】:

  • 由于各种原因,这不是一个好主意。其中之一是用不需要的变量污染命名空间和地址空间
  • 我知道为什么这是一个坏主意,我在我的小字中指出了这一点。
  • 确实,但我目前的选项非常冗长,我宁愿不必在每次想对它们做某事时定义我感兴趣的 20 个左右的属性!这会让 linter 感到难过,因为它的语法完全不正确:P
  • 你能把整个巨大的物体沿着承诺链传递吗?
  • 没有with 是不可能的,但这是潜在的 XY 问题。如果您的目标是将某些值从其中传递到承诺链的下一部分,为什么您需要将它们设为局部变量。可能有适合您的情况的解决方案,可能是pick 或其他。我建议根据情况重新提问。

标签: javascript ecmascript-6 object-destructuring


【解决方案1】:

如果您想对键做某事但不想定义它们,为什么不使用Object.keysObject.entries

const foo = (args) => {
  Object.entries(args).forEach(([key, value]) => {
    console.log(key, value);
  });
};

foo(bar);

【讨论】:

  • 很遗憾,这不是我所问问题的答案。
猜你喜欢
  • 2018-12-21
  • 2018-07-24
  • 2015-11-15
  • 2022-12-12
  • 1970-01-01
  • 2013-11-26
  • 2021-12-23
  • 1970-01-01
  • 2012-10-13
相关资源
最近更新 更多