1234567891011121314151617181920212223242526272829303132333435363738 |
- "use strict";
-
- var forEach = require("./for-each")
- , isPlainObject = require("./is-plain-object")
- , ensureValue = require("./valid-value")
- , isArray = Array.isArray;
-
- var copyValue = function (value, ancestors, ancestorsCopy) {
- var mode;
- if (isPlainObject(value)) mode = "object";
- else if (isArray(value)) mode = "array";
- if (!mode) return value;
-
- var copy = ancestorsCopy[ancestors.indexOf(value)];
- if (copy) return copy;
- copy = mode === "object" ? {} : [];
-
- ancestors.push(value);
- ancestorsCopy.push(copy);
- if (mode === "object") {
- forEach(value, function (item, key) {
- copy[key] = copyValue(item, ancestors, ancestorsCopy);
- });
- } else {
- value.forEach(function (item, index) {
- copy[index] = copyValue(item, ancestors, ancestorsCopy);
- });
- }
- ancestors.pop();
- ancestorsCopy.pop();
-
- return copy;
- };
-
- module.exports = function (source) {
- return copyValue(ensureValue(source), [], []);
- };
|