{"ScriptPreparationCode":"obj = {\tsum: {\r\n calc: \u0022wSum\u0022, //sum, wSum, ave, wAve, hwAve\r\n forGroup: true,\r\n },\r\n formatting: {\r\n dataType: \u0022number\u0022, //[int, number, pct1, pct100, folioCurrency, assetCurrency]\r\n },\r\n tableDisplay: {\r\n visibility: \u0022user\u0022, //always, default, user\r\n editable: true,\r\n columnTemplate_name: \u0022number\u0022,\r\n showSumInGroup: true,\r\n showSum: true,\r\n formatting: {\r\n dataType: \u0022number\u0022, //[int, number, pct1, pct100, folioCurrency, assetCurrency]\r\n decimals: 1,\r\n //preFix: \u0022\u0022,\r\n //postFix: \u0022\u0022,\r\n },\r\n //this triggers on click of the button, as well as on double-tap and long-tap on a touch device\r\n headerButtonMenu: [\r\n {text: \u0022Remove Column\u0022, method: \u0022removeField\u0022}\r\n ],\r\n cellContextMenu: [\r\n {text: \u0022Clear\u0022, method: \u0022clearCell\u0022},\r\n ],\r\n headerContextMenu: [\r\n {text: \u0022Clear All\u0022, method: \u0022clearColumn\u0022},\r\n ]\r\n }\r\n }\r\n \r\n \r\ndeepClone_simple = function(o) {\r\n let isArray = Array.isArray;\r\n let objectKeys = Object.keys;\r\n return copy(o);\r\n\r\n function copy(val) {\r\n if (!val) return val;\r\n if (isArray(val)) {\r\n let arr = [];\r\n let length = val.length;\r\n for (let i = 0; i \u003C length; i\u002B\u002B) {\r\n val2 = val[i]\r\n if (isArray(val2)) {\r\n let arr2 = [];\r\n let length2 = val.length;\r\n for (let i = 0; i \u003C length; i\u002B\u002B) arr.push(copy(val[i]))\r\n return arr;\r\n } else if (typeof val === \u0027object\u0027) {\r\n let keys = objectKeys(val);\r\n let newObject = {};\r\n for (let i = keys.length - 1; i \u003E -1; i--) {\r\n let key = keys[i];\r\n newObject[key] = copy(val[key]);\r\n }\r\n return newObject;\r\n }\r\n return val;\r\n arr.push(copy(val[i]))\r\n }\r\n return arr;\r\n } else if (typeof val === \u0027object\u0027) {\r\n let keys = objectKeys(val);\r\n let newObject = {};\r\n for (let i = keys.length - 1; i \u003E -1; i--) {\r\n let key = keys[i];\r\n newObject[key] = copy(val[key]);\r\n }\r\n return newObject;\r\n }\r\n return val;\r\n }\r\n}\r\n\r\ndeepClone = function(o){\r\n // if not array or object or is null return self\r\n let deepClone = this.deepClone;\r\n if (typeof o !== \u0027object\u0027||o === null) return o;\r\n let newO, i;\r\n // handle case: array\r\n if (o instanceof Array) {\r\n let l, i;\r\n newO = [];\r\n for (i = 0, l = o.length; i \u003C l; i\u002B\u002B) newO[i] = deepClone(o[i]);\r\n return newO;\r\n }\r\n // handle case: object\r\n newO = {};\r\n for (i in o) if (o.hasOwnProperty(i)) newO[i] = deepClone(o[i]);\r\n return newO;\r\n}\r\n\r\ndeepCloneOrAssign = function(o, dest){\r\n // only deep assigns objects and arrays, NOT dates, maps, sets etc.\r\n let deepCloneOrAssign = this.deepCloneOrAssign;\r\n if (typeof o !== \u0027object\u0027||o === null) return o;\r\n let newO, i;\r\n // handle case: array\r\n if (o instanceof Array) {\r\n dest = dest ?? [];\r\n let l, i;\r\n for (i = 0, l = o.length; i \u003C l; i\u002B\u002B) dest[i] = deepCloneOrAssign(o[i], dest[i]);\r\n return newO;\r\n }\r\n // handle case: object\r\n dest = dest ?? {};\r\n for (i in o) if (o.hasOwnProperty(i)) dest[i] = deepCloneOrAssign(o[i], dest[i]);\r\n return dest;\r\n}","TestCases":[{"Name":"deepClone","Code":"return deepClone(obj)","IsDeferred":false},{"Name":"deepClone_simple","Code":"return deepClone_simple(obj)","IsDeferred":false},{"Name":"deepCloneOrAssign","Code":"return deepCloneOrAssign(obj)","IsDeferred":false}]}