0
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
4

2 回答 2

2

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

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

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

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

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

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

另请参阅One-liner 以从 ES 6 中的对象中获取一些属性

于 2015-08-19T18:44:50.253 回答
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'])
于 2015-08-19T18:43:22.803 回答