【问题标题】:Is it possible to destructure an object and generate a new object in a single statement? [duplicate]是否可以在单个语句中解构对象并生成新对象? [复制]
【发布时间】:2015-08-19 17:33:50
【问题描述】:
const {name, slug, description, parent} = cat;
const saneCat = {name, slug, description, parent};

在第一个表达式中,我们通过解构一个杂乱的对象来定义四个常量。在第二个表达式中,我们将它们组合成一个新对象。我想在不复制有趣字段列表的情况下一步完成,但因为第一个表达式没有定义对象,这似乎是不可能的。真的吗?我们非常接近 Clojurian 的胜利!

我尝试了以下但没有成功。任何 ECMAScript 编译器都是公平的游戏,但我没有选择只使用 Clojurescript。

const saneCat = {name, slug, description, parent} = cat; // name is not defined
const {...saneCat} = {name, slug, description} = cat;  // name is not defined
const saneCat = ({name, slug, description, parent} = cat); // name is not defined
const saneCat = ({name, slug, description, parent}) = cat; // name is not defined
const saneCat = {{name, slug, description, parent}} = cat; // unexpected token
const saneCat = {{name, slug, description, parent}} = {cat}; // unexpected token

【问题讨论】:

  • 为什么不使用像_.pluck(cat, ['name', 'slug', 'description', 'parent']) 这样的现有库?解构主要用于将属性提取到可赋值的表达式/变量中。
  • 你的意思是_.pick?以前没用过,谢谢指点。它确实解决了我的例子。我有点希望 ES6 理解和解构结合起来比库更灵活、更简洁,但看起来这两种语言特性并不是为了一起使用而设计的。
  • 是的,哇,_.pick(cat, ['name', 'slug', 'description', 'parent'])。我实际上注意到我打错了,显然忘了修复它? :P 您可以技术上使用解构,但只能以不比当前示例短的方式使用,例如const saneCat = {}; ({name: saneCat.name, slug: saneCat.slug} = cat); 但哇,它不可读
  • @Bergi 是的,这是一个 dup,但为什么要指出另一个本身就是一个 dup 的问题?

标签: ecmascript-6 destructuring


【解决方案1】:

不幸的是,ES6 中的解构仅限于赋值和参数列表。有一个关于“pick”操作符的讨论,它可以做你想做的事,但不要屏住呼吸。

同时,您可以找到的最接近的是以下内容,这需要复制属性列表:

const saneCat = 
  (({name, slug, description, parent}) => 
    ({name, slug, description, parent})
  )(cat);

使用建议的选择语法,您将能够编写

const saneCat = {name, slug, description, parent} # cat;

类似的东西应该出现在 ES29 中。在那之前,您可以使用评论中提到的那种选择实用程序,但就个人而言,我讨厌将属性写成字符串。

另见One-liner to take some properties from object in ES 6

【讨论】:

    【解决方案2】:

    解构基本上是去糖化

    ({a} = obj}
    // a = obj.a
    
    ({a: foo} = obj)
    // foo = obj.a
    
    ({a: foo.bar} = obj)
    // foo.bar = obj.a
    

    所以从obj 中拉出一个键并将其放入另一个对象的唯一方法是在两者中重复键的名称,因为它没有简洁的形式,所以要回答你的问题,你可以在技术上做

    const saneCat = {};
    ({
        name: saneCat.name,
        slug: saneCat.slug,
        description: saneCat.description,
        parent: saneCat.parent
    } = cat);
    

    但这很难阅读,甚至更难理解。我绝对建议使用现有的库或函数来执行此操作,例如 Lodash 的 pick

    const saneCat = _.pick(cat, ['name', 'slug', 'description', 'parent'])
    

    【讨论】:

      猜你喜欢
      • 2020-07-17
      • 2016-11-28
      • 2022-01-24
      • 1970-01-01
      • 1970-01-01
      • 2019-09-10
      • 1970-01-01
      • 2012-05-13
      • 1970-01-01
      相关资源
      最近更新 更多