<div dir="ltr">What I'd like is this syntax:<div><br></div><div>```js</div><div>let o={a:1, b:2, c:3};</div><div>o.{a, b} // would be {a: 1, b: 2}<br></div><div>```</div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Tue, May 28, 2019 at 9:13 PM Григорий Карелин <<a href="mailto:grundiss@gmail.com">grundiss@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr">Here are another examples, where "destructuring picking" I suggest whould be helpful.<div>==1A Now (redux related)</div><div>```</div><div>function mapStateToProps({user: {firstName, lastName}, common: {currentPageURL: url}}) {</div><div>  return {firstName, lastName, url};</div><div>}</div><div>```</div><div>==1B Proposal</div><div>```</div><div>function mapStateToProps(state) {</div><div>  return {{firstName, lastName from state.user}, {currentPageURL as url from state.common}};</div><div>}</div><div>```</div><div><br></div><div>Shorter!</div><div><br></div><div>==2A Now</div><div>```</div><div>async function saveNewUserName(name) {</div><div>  const {name} = await sendToServer({name});</div><div><br></div><div>  return {ok: true, payload: {name}}; // oh wait, which name is it again? Argument or response?</div><div>}</div><div>```</div><div>== 2B Proposal</div><div>```</div><div>async function saveNewUserName(name) {</div><div>  const resp = await sendToServer({name});</div><div><br></div><div>  return {ok: true, {name from response}};</div><div>}</div><div>```</div><div>No accidental shadowing.</div><div><br></div><div>I know, I know, you can achieve all that without new syntax, via naming your variables properly and using long explicit expressions. But I think some sugar won't hurt.</div><div>After all, remember destructuring? There's no reason to use it other than it's cool and short and expressive.</div><div><br></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">вт, 28 мая 2019 г. в 21:49, guest271314 <<a href="mailto:guest271314@gmail.com" target="_blank">guest271314@gmail.com</a>>:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">```<br>let obj = {otherData: "other data"};<br>({firstName:obj.firstName, lastName:obj.lastName} = user.profile);<br>``` </blockquote></div></blockquote><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">I don't understand this.</blockquote></div></blockquote></div><div><br></div><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment#Assigning_to_new_variable_names" target="_blank">https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment#Assigning_to_new_variable_names</a><div><br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">He's looking for a terser</blockquote><div><br></div><div>Is the proposal to golf destructuring assignment? </div><div><br></div><div>The proposed destructuring assignment syntax example is 25 characters less than the non-destructing assignment example, which is terser.</div><div><br></div><div>One observation about the proposed syntax is that the values set at the target object would be set from the identifier on the left side of ```from``` which is similar to </div></div><div><br></div><div>```</div><div>var o = {x:1};<br></div><div>console.log(o.x = 2); // 2</div><div>```</div><div><br></div><div>though how will the property name be set at the object at target object instead of `{"2":2}`? How does the engine know when the expected result is ```{"x":2}``` and not ```{"2":2}```? Certainly such functionality can be designed, for example, using the proposed key word ```from```. </div><div><br></div><div>If more terse code is one of the features that would be achieved, why are the wrapping `{}` around ```from`` necessary?</div><div><br></div><div>> moire elegant way to do it, </div><div><br></div><div>"elegant" is subjective</div><div><br></div><div>> which hopefully would be moire semantic, less bug-prone, more type-checkable (for typed variants of the language), more reminiscent of existing syntax such as deconstruction, and potentially more optimizable by engines.<br></div><div><br></div><div>What is bug prone about the code examples at OP?</div><div><br></div><div>This proposal would resolve the issue of currently, in general, having to write the property name twice.</div><div><br></div><div><br></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Tue, May 28, 2019 at 2:47 PM Bob Myers <<a href="mailto:rtm@gol.com" target="_blank">rtm@gol.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div>```<br></div></div><div dir="ltr"><div>let obj = {otherData: "other data"};<br>({firstName:obj.firstName, lastName:obj.lastName} = user.profile);<br></div><div>```</div></div></blockquote><div><br></div><div>I don't understand this.</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div>Alternatively there are various approaches which can be used to get only specific properties from an abject and set those properties and values at a new object without using destructing assignment.</div><div><br></div><div>Using object rest and ```reduce()```</div><div><br></div><div>```let obj = {otherData: "other data", ...["firstName", "lastName"].reduce((o, prop) => (o[prop] = user.profile[prop], o), {})};```</div><div><br></div><div>`Object.assign()`, spread syntax and `map()`</div><div><br></div><div>```let obj = Object.assign({otherData: "other data"}, ...["firstName", "lastName"].map(prop => ({[prop]:user.profile[prop]})));```</div></div></blockquote><div><br></div><div>As the words "syntactic sugar" in the subject of the thread make clear, the OP is not merely looking for ways to assign one object's property into another--there are many ways to do that. He's looking for a terser, moire elegant way to do it, which hopefully would be moire semantic, less bug-prone, more type-checkable (for typed variants of the language), more reminiscent of existing syntax such as deconstruction, and potentially more optimizable by engines.</div><div><br></div><div>Bob</div></div></div>
_______________________________________________<br>
es-discuss mailing list<br>
<a href="mailto:es-discuss@mozilla.org" target="_blank">es-discuss@mozilla.org</a><br>
<a href="https://mail.mozilla.org/listinfo/es-discuss" rel="noreferrer" target="_blank">https://mail.mozilla.org/listinfo/es-discuss</a><br>
</blockquote></div>
_______________________________________________<br>
es-discuss mailing list<br>
<a href="mailto:es-discuss@mozilla.org" target="_blank">es-discuss@mozilla.org</a><br>
<a href="https://mail.mozilla.org/listinfo/es-discuss" rel="noreferrer" target="_blank">https://mail.mozilla.org/listinfo/es-discuss</a><br>
</blockquote></div><br clear="all"><div><br></div>-- <br><div dir="ltr" class="gmail-m_-2924106993250688575gmail_signature">С уважением,<br>Карелин Григорий</div>
_______________________________________________<br>
es-discuss mailing list<br>
<a href="mailto:es-discuss@mozilla.org" target="_blank">es-discuss@mozilla.org</a><br>
<a href="https://mail.mozilla.org/listinfo/es-discuss" rel="noreferrer" target="_blank">https://mail.mozilla.org/listinfo/es-discuss</a><br>
</blockquote></div>