是否有可能解构到一个现有的对象? (Javascript ES6)

例如,如果我有两个对象:

var foo = { x: "bar", y: "baz" } 

 var oof = {} 

我想把foo的x和y值传给oof。 有没有办法做到这一点,使用es6解构语法?

也许是这样的:

 oof{x,y} = foo 

虽然丑陋,有点重复,你可以做

 ({x: oof.x, y: off.y} = foo); 

它将读取foo对象的两个值,并将它们写入oof对象的相应位置。

就我个人而言,我仍然宁愿阅读

 oof.x = foo.x; oof.y = foo.y; 

要么

 ['x', 'y'].forEach(prop => oof[prop] = foo[prop]); 

虽然。

不,解构不支持成员expression式,而只支持当前的纯属性名称。 关于这样的讨论已经有了讨论 ,但没有任何提案会把它变成ES6。

你也许可以使用Object.assign但是如果你不需要所有的属性,你仍然可以

 var foo = …, oof = {}; { let {x, y} = foo; Object.assign(oof, {x, y}) } 

Object.assign还有对象扩展语法 ,即ECMAScript的第2阶段提议。

 var foo = { x: "bar", y: "baz" } var oof = { z: "z" } oof = {...oof, ...foo } console.log(oof) /* result { "x": "bar", "y": "baz", "z": "z" } */ 

但是为了使用这个特性,你需要为babel使用stage-2或者transform-object-rest-spread插件。 这是一个stage-2巴贝尔演示

海事组织这是最简单的方法来完成你要找的东西:

 let { prop1, prop2, prop3 } = someObject; let data = { prop1, prop2, prop3 }; // data === { prop1: someObject.prop1, ... } 

基本上,解构成variables,然后使用初始化速记做一个新的对象。 不需要Object.assign

我认为这是最可读的方式,反正。 你可以在这里select你想要的someObject的确切道具。 如果你有一个现有的对象,你只是想合并道具,做这样的事情:

 let { prop1, prop2, prop3 } = someObject; let data = Object.assign(otherObject, { prop1, prop2, prop3 }); // Makes a new copy, or... Object.assign(otherObject, { prop1, prop2, prop3 }); // Merges into otherObject 

我使用这个POST请求很多,我只需要几块离散数据。 但是,我同意这样做应该有一个class轮。

这在铬53.0.2785.89工作

 let foo = { x: "bar", y: "baz" }; let oof = {x, y} = foo; console.log(`oof: ${JSON.stringify(oof)}); //prints oof: { "x": "bar", "y": "baz" } 

我想出了这个方法:

 exports.pick = function pick(src, props, dest={}) { return Object.keys(props).reduce((d,p) => { if(typeof props[p] === 'string') { d[props[p]] = src[p]; } else if(props[p]) { d[p] = src[p]; } return d; },dest); }; 

你可以这样使用:

 let cbEvents = util.pick(this.props.events, {onFocus:1,onBlur:1,onCheck:'onChange'}); let wrapEvents = util.pick(this.props.events, {onMouseEnter:1,onMouseLeave:1}); 

即,你可以select你想要的属性,并把它们放入一个新的对象。 不像_.pick你也可以同时重命名它们。

如果要将道具复制到现有对象上,只需设置dest arg即可。

这是作弊,但你可以做这样的事情…

 const originalObject = { hello: 'nurse', meaningOfLife: 42, your: 'mom', }; const partialObject = (({ hello, your }) => { return { hello, your }; })(originalObject); console.log(partialObject); // ​​​​​{ hello: 'nurse', your: 'mom' }​​​​​ 

实际上,我认为你很less想用这个。 以下更清楚…但不是很有趣。

 const partialObject = { hello: originalObject.hello, your: originalObject.your, }; 

另一个完全不同的路线,其中包括原型(仔细现在…):

 if (!Object.prototype.pluck) { Object.prototype.pluck = function(...props) { return props.reduce((destObj, prop) => { destObj[prop] = this[prop]; return destObj; }, {}); } } const originalObject = { hello: 'nurse', meaningOfLife: 42, your: 'mom', }; const partialObject2 = originalObject.pluck('hello', 'your'); console.log(partialObject2); // { hello: 'nurse', your: 'mom' } 

您可以在箭头函数中返回解构对象,并使用Object.assign()将其分配给一个variables。

 const foo = { x: "bar", y: "baz" } const oof = Object.assign({}, () => ({ x, y } = foo)); 

你可以像这样使用重组:

 const foo = {x:"a", y:"b"}; const {...oof} = foo; // {x:"a", y:"b"} 

或者如果oof具有值,则合并两个对象:

 const foo = {x:"a", y:"b"}; let oof = {z:"c"} oof = Object.assign({}, oof, foo) 

这是我能想到的最可读和最短的解决scheme:

 let props = { isValidDate: 'yes', badProp: 'no!', }; let { isValidDate } = props; let newProps = { isValidDate }; console.log(newProps); 

它会输出{ isValidDate: 'yes' }

有一天能够说let newProps = ({ isValidDate } = props)会很好,但不幸的是这不是ES6支持的。