digressing a bit, but once you get used to the idea of deep-copying objects using JSON.parse(JSON.stringify(x)), you also realize web-projects are alot simpler if you keep many non-JSON-datatypes in string-form by default (BigInt, Date, CivilXxx, etc.), since the use-case to copy/serialize data between web-components is far more common than the need to actually revive data for use in low-level business-logic.
kai zhu [email protected] > On 24 Oct 2018, at 2:22 AM, Jamie <[email protected]> wrote: > > 4 dots is already valid syntax when it has a number after it > > let o = { ....4 } > > > On Tue, Oct 23, 2018 at 9:05 AM kai zhu <[email protected] > <mailto:[email protected]>> wrote: > hi Bilai, there’s no reliable way to deep-copy arbitrary js-objects. the most > practical “general” solution is two-step: > > 1. deep-copy JSON-data first, e.g. ```var bb = > JSON.parse(JSON.stringify(aa))``` > 2. custom-copy non-JSON-data in a second-pass, e.g. ```bb.innerObj.func = > aa.innerObj.func``` > > like this real-world example [1]: > > ```javascript > local.jsonCopy = function (obj) { > /* > * this function will [JSON] deep-copy obj > */ > return obj === undefined > ? undefined > : JSON.parse(JSON.stringify(obj)); > }; > ... > // update apiDict > self = local.apiDict[key.join('.')] = local.apiDict[self._methodPath] = > local.jsonCopy(self); // step 1 - deep-copy JSON-data first > // init ajax > self.ajax = function (swaggerJson, onError) { // step 2 - custom-copy/add > non-JSON-data in second-pass > return local.apiAjax(self, swaggerJson, onError); > }; > ``` > > [1] deep-copy swagger client-object with functions > https://github.com/kaizhu256/node-swgg/blob/2018.9.8/lib.swgg.js#L2181 > <https://github.com/kaizhu256/node-swgg/blob/2018.9.8/lib.swgg.js#L2181> > > kai zhu > [email protected] <mailto:[email protected]> > > > >> On 23 Oct 2018, at 10:25 PM, Naveen Chawla <[email protected] >> <mailto:[email protected]>> wrote: >> >> Correction, suppose const b = { a : b } . Circular references can be cloned >> trivially, as far as I can tell >> >> On Tue, 23 Oct 2018 at 20:52 Naveen Chawla <[email protected] >> <mailto:[email protected]>> wrote: >> Is there any real problem with circular reference cloning? I don't see any, >> Please let me know in the simplest case e.g. { a: a } (obviously contrived >> syntax here) >> >> Otherwise, I agree completely about the 4 dots being the wrong syntax for >> this, precisely for the reason you gave >> >> On Tue, 23 Oct 2018 at 18:18 Henrique Barcelos <[email protected] >> <mailto:[email protected]>> wrote: >> IMO, this would be very problematic. >> >> 1. 4 dots are visually almost identical to 3 dots. This could introduce >> severe bugs because of a simple hard to spot typo. >> >> 2. Deep traversing will always have performance problems in some cases. >> Dealing with circular references can take this issue even further. >> >> I believe such functionality should be used in very specific situations, >> where object shape is well-known, not very deep and definitely not circular. >> So, supporting this at the core of the language will probably be frowned >> upon by the community. >> >> Em ter, 23 de out de 2018 08:57, Ahad Cove <[email protected] >> <mailto:[email protected]>> escreveu: >> Hello Scripters, >> >> I really appreciate everything you all have done for the language and have >> no complaints over here. >> I do have a suggestion though :) >> >> At work we’ve almost got rid of lodash, except we still need it for DeepCopy >> vs rolling our own. >> It’s the same with my side projects. I don’t use lodash because the main >> times that I need deep copy is when I’m either digging into the Redux store >> using React, or copying an observable in the Angular world. >> >> I believe ES Script users would appreciate having a deep copy spread >> operator tremendously. >> >> My proposal is to go off of the current spread operator we currently have in >> ES and make it 4 dots for a deep spread. This can be used on Objects or >> Arrays. >> >> ‘’’js >> const oldDeepObj = { >> InnerObj: { >> func: () => return ‘wow’ >> } >> } >> >> const obj = {....oldDeepObj} >> obj.innerObj.func = () => return ‘nice’ >> >> oldDeepObj.innerObj.func() >> > wow >> ‘’’ >> >> Thank you! >> Looking forward to hearing back from you all. >> If there’s any other questions let me know >> >> - Bilal Abdullah >> _______________________________________________ >> es-discuss mailing list >> [email protected] <mailto:[email protected]> >> https://mail.mozilla.org/listinfo/es-discuss >> <https://mail.mozilla.org/listinfo/es-discuss> >> -- >> Henrique >> >> _______________________________________________ >> es-discuss mailing list >> [email protected] <mailto:[email protected]> >> https://mail.mozilla.org/listinfo/es-discuss >> <https://mail.mozilla.org/listinfo/es-discuss> >> _______________________________________________ >> es-discuss mailing list >> [email protected] <mailto:[email protected]> >> https://mail.mozilla.org/listinfo/es-discuss >> <https://mail.mozilla.org/listinfo/es-discuss> > > _______________________________________________ > es-discuss mailing list > [email protected] <mailto:[email protected]> > https://mail.mozilla.org/listinfo/es-discuss > <https://mail.mozilla.org/listinfo/es-discuss>
_______________________________________________ es-discuss mailing list [email protected] https://mail.mozilla.org/listinfo/es-discuss

