1234567891011121314151617181920212223242526272829303132333435363738 |
- 'use strict';
- var forEach = require('./for-each')
- , isPlainObject = require('./is-plain-object')
- , value = require('./valid-value')
- , isArray = Array.isArray
- , copy, copyItem;
- copyItem = function (value, key) {
- 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(value(source));
- if (obj !== source) return obj;
- return copy.call([[], []], obj);
- };
|