是否有可能解构到一个现有的对象? (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支持的。