是否可以在单个语句中对对象进行解构并生成新对象?

时间:2015-08-19 17:33:51

标签: ecmascript-6 destructuring

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

2 个答案:

答案 0 :(得分:2)

不幸的是,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

答案 1 :(得分:1)

解构基本上是糖尿病

({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'])