aboutsummaryrefslogtreecommitdiff
path: root/node_modules/es5-ext/object/copy-deep.js
diff options
context:
space:
mode:
Diffstat (limited to 'node_modules/es5-ext/object/copy-deep.js')
-rw-r--r--node_modules/es5-ext/object/copy-deep.js42
1 files changed, 42 insertions, 0 deletions
diff --git a/node_modules/es5-ext/object/copy-deep.js b/node_modules/es5-ext/object/copy-deep.js
new file mode 100644
index 000000000..d1d39c982
--- /dev/null
+++ b/node_modules/es5-ext/object/copy-deep.js
@@ -0,0 +1,42 @@
+"use strict";
+
+var forEach = require("./for-each")
+ , isPlainObject = require("./is-plain-object")
+ , ensureValue = require("./valid-value")
+ , isArray = Array.isArray
+ , copy
+ , copyItem;
+
+copyItem = function (value) {
+ var index;
+ if (!isPlainObject(value) && !isArray(value)) return value;
+ index = this[0].indexOf(value);
+ if (index === -1) return copy.call(this, value);
+ return this[1][index];
+};
+
+copy = function (source) {
+ var target = isArray(source) ? [] : {};
+ this[0].push(source);
+ this[1].push(target);
+ if (isArray(source)) {
+ source.forEach(function (value, key) {
+ target[key] = copyItem.call(this, value, key);
+ }, this);
+ } else {
+ forEach(
+ source,
+ function (value, key) {
+ target[key] = copyItem.call(this, value, key);
+ },
+ this
+ );
+ }
+ return target;
+};
+
+module.exports = function (source) {
+ var obj = Object(ensureValue(source));
+ if (obj !== source) return obj;
+ return copy.call([[], []], obj);
+};