使用解构为对象属性

时间:2017-12-28 18:24:41

标签: javascript node.js ecmascript-6

我在我的ES6代码的各种实例中使用了解构,但今天我尝试缩短模型实例声明,但它在节点中并不完全正常。基本上,我从YouTube Data API中提取数据并将其存储在MongoDB实例中。因此,我从响应的缩略图部分创建了一个对象,如下所示:

thumbnailData = {
      smallWidth: element.snippet.thumbnails.default.width,
      smallHeight: element.snippet.thumbnails.default.height,
      smallURL: element.snippet.thumbnails.default.url,
      medWidth: element.snippet.thumbnails.medium.width,
      medHeight: element.snippet.thumbnails.medium.height,
      medURL: element.snippet.thumbnails.medium.url,
      highWidth: element.snippet.thumbnails.high.width,
      highHight: element.snippet.thumbnails.high.height,
      highURL: element.snippet.thumbnails.high.url
    }

我有一个像这样的Mongoose架构:

const ThumbnailSchema = new Schema({
  smallWidth: Number,
  smallHeight: Number,
  smallURL: String,
  medWidth: Number,
  medHeight: Number,
  medURL: String,
  highWidth: Number,
  highHight: Number,
  highURL: String
});
const Thumbnail = mongoose.model('thumbnail', ThumbnailSchema);

所以我试图在我的宣言中做这样的事情:

let thumbs = new Thumbnail;
({ thumbs.smallWidth, thumbs.smallHeight, thumbs.smallURL } = thumbnailData);

但是node.js会抛出一个简单的“Unexpect令牌”。以上我的使用。在左侧。想法,如果这是可能的?这只是让我必须以如此长的形式写出对象,但是如果需要的话,我可以保留它,因为它确实有效。它看起来很像下面的语法,所以不确定区别是什么,谢谢。

var a, b;
({ a, b } = {a: 1, b: 2});

3 个答案:

答案 0 :(得分:0)

您的代码

({ thumbs.smallWidth, thumbs.smallHeight, thumbs.smallURL } = thumbnailData);

不起作用。因为Js解释器不期望左手中的标记.被视为属性访问。为了使它工作,你可以使用

({ a: thumbs.smallWidth, b:thumbs.smallHeight, c:thumbs.smallURL } = thumbnailData);

这会将值分配给新对象。这是一个工作片段:



var data = {a: "a", b: "b"};

( {a: data.a, b: data.b} = {a: 1, b : 2})

console.log(data.a)




答案 1 :(得分:0)

 Object.assign(thumbs, (({ smallWidth, smallHeight, smallURL}) => ({smallWidth, smallHeight, smallURL}))(thumbnailData));

使用参数解构的小型IIFE可行。或旧时尚:

 for(var key of ["smallWidth", "smallHeight", "smallURL"])
  thumbs[key] = thumbnailData[key];

答案 2 :(得分:0)

你无法以这种方式对对象进行解构,Javascript将这些点识别为属性访问,就像@Bergi所评论的那样。但是,最小化重复的一种方法是将mediumhighthumbnailsconst { 'default': dflt, medium, high } = element.snippet.thumbnails; let thumbs = new Thumbnail({ smallWidth: dflt.width, smallHeight: dflt.height, smallURL: dflt.url, medWidth: medium.width, medHeight: medium.height, medURL: medium.url, highWidth: high.width, highHight: high.height, highURL: high.url }); 属性中解构出来:

{{1}}