{"ScriptPreparationCode":"(function(_, Backbone) {\r\n var arrays, basicObjects, deepClone, deepExtend, deepExtendCouple, isBasicObject,\r\n __slice = [].slice;\r\n\r\n deepClone = function(obj) {\r\n var func, isArr;\r\n if (!_.isObject(obj) || _.isFunction(obj)) {\r\n return obj;\r\n }\r\n if (obj instanceof Backbone.Collection || obj instanceof Backbone.Model) {\r\n return obj;\r\n }\r\n if (_.isDate(obj)) {\r\n return new Date(obj.getTime());\r\n }\r\n if (_.isRegExp(obj)) {\r\n return new RegExp(obj.source, obj.toString().replace(/.*\\//, \u0022\u0022));\r\n }\r\n isArr = _.isArray(obj || _.isArguments(obj));\r\n func = function(memo, value, key) {\r\n if (isArr) {\r\n memo.push(deepClone(value));\r\n } else {\r\n memo[key] = deepClone(value);\r\n }\r\n return memo;\r\n };\r\n return _.reduce(obj, func, isArr ? [] : {});\r\n };\r\n\r\n isBasicObject = function(object) {\r\n if (object == null) return false;\r\n return (object.prototype === {}.prototype || object.prototype === Object.prototype) \u0026\u0026 _.isObject(object) \u0026\u0026 !_.isArray(object) \u0026\u0026 !_.isFunction(object) \u0026\u0026 !_.isDate(object) \u0026\u0026 !_.isRegExp(object) \u0026\u0026 !_.isArguments(object);\r\n };\r\n\r\n basicObjects = function(object) {\r\n return _.filter(_.keys(object), function(key) {\r\n return isBasicObject(object[key]);\r\n });\r\n };\r\n\r\n arrays = function(object) {\r\n return _.filter(_.keys(object), function(key) {\r\n return _.isArray(object[key]);\r\n });\r\n };\r\n\r\n deepExtendCouple = function(destination, source, maxDepth) {\r\n var combine, recurse, sharedArrayKey, sharedArrayKeys, sharedObjectKey, sharedObjectKeys, _i, _j, _len, _len1;\r\n if (maxDepth == null) {\r\n maxDepth = 20;\r\n }\r\n if (maxDepth \u003C= 0) {\r\n console.warn(\u0027_.deepExtend(): Maximum depth of recursion hit.\u0027);\r\n return _.extend(destination, source);\r\n }\r\n sharedObjectKeys = _.intersection(basicObjects(destination), basicObjects(source));\r\n recurse = function(key) {\r\n return source[key] = deepExtendCouple(destination[key], source[key], maxDepth - 1);\r\n };\r\n for (_i = 0, _len = sharedObjectKeys.length; _i \u003C _len; _i\u002B\u002B) {\r\n sharedObjectKey = sharedObjectKeys[_i];\r\n recurse(sharedObjectKey);\r\n }\r\n sharedArrayKeys = _.intersection(arrays(destination), arrays(source));\r\n combine = function(key) {\r\n return source[key] = _.union(destination[key], source[key]);\r\n };\r\n for (_j = 0, _len1 = sharedArrayKeys.length; _j \u003C _len1; _j\u002B\u002B) {\r\n sharedArrayKey = sharedArrayKeys[_j];\r\n combine(sharedArrayKey);\r\n }\r\n return _.extend(destination, source);\r\n };\r\n\r\n deepExtend = function() {\r\n var finalObj, maxDepth, objects, _i;\r\n objects = 2 \u003C= arguments.length ? __slice.call(arguments, 0, _i = arguments.length - 1) : (_i = 0, []), maxDepth = arguments[_i\u002B\u002B];\r\n if (!_.isNumber(maxDepth)) {\r\n objects.push(maxDepth);\r\n maxDepth = 20;\r\n }\r\n if (objects.length \u003C= 1) {\r\n return objects[0];\r\n }\r\n if (maxDepth \u003C= 0) {\r\n return _.extend.apply(this, objects);\r\n }\r\n finalObj = objects.shift();\r\n while (objects.length \u003E 0) {\r\n finalObj = deepExtendCouple(finalObj, deepClone(objects.shift()), maxDepth);\r\n }\r\n return finalObj;\r\n };\r\n\r\n _.mixin({\r\n deepClone: deepClone,\r\n isBasicObject: isBasicObject,\r\n basicObjects: basicObjects,\r\n arrays: arrays,\r\n deepExtend: deepExtend\r\n });\r\n\r\n}).call(this, _, Backbone);\r\n\r\nvar items = [ ...Array(10000).keys() ].map( i =\u003E { return { bar: \u0022foo\u0022 } });\r\n","TestCases":[{"Name":"Underscore extended deepClone","Code":"_.deepClone(items);","IsDeferred":false},{"Name":"JSON parse/stringify","Code":"JSON.parse(JSON.stringify(items));","IsDeferred":false}]}