You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
35 lines
934 B
35 lines
934 B
"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), [], []); };
|
|
|