<script src='https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.5/lodash.min.js'></script>
var MyObject = JSON.parse(`{
"status": 200,
"message": "seConfig(210-2) last updated by user apiuser on 2020-09-25T03:52:14Z",
"errors": [],
"seConfig": {
"id": 210,
"name": "New configuration",
"description": "Adding factor with tags amd removing use case tags ",
"versionId": 2,
"status": "DRAFT",
"createdFromVersionId": 1,
"importedFrom": null,
"requirements": "",
"numActiveUsers": 0,
"numUsers": 0,
"numAccounts": 0,
"configCountryCode": "DEFAULT",
"isReadOnly": false,
"repTeamId": null,
"isMasterConfig": false,
"lastSyncTimestamp": null,
"lastSyncHashCode": null,
"lastSyncReport": null,
"isSyncPending": false,
"createdAt": "2020-09-25T03:50:15Z",
"createdBy": "apiuser",
"updatedAt": "2020-09-25T03:52:14Z",
"updatedBy": "apiuser",
"startedAt": null,
"startedBy": null,
"stoppedAt": null,
"stoppedBy": null,
"errors": [],
"statusId": 0,
"repTeam": {
"name": null,
"uid": null,
"numReps": null
},
"globalParameters": [
{
"typeId": "GlobalParameters",
"requirements": "",
"name": "GlobalParameters",
"description": "GlobalParameters",
"availableProductsForFactors": "QA_a00U000000PunPcIA;QA_a00U000000PunPvIA;QA_a00U000000PunQ7IA;QA_a00U000000XL37cIA;AKT_ALL_PRODUCTS;a00g000000BoMJfAAN;a00g000000BoMKEAA3;a00g000000BoMKTAA3;PROD-01;PROD-02;PROD-03;PROD-04;PROD-05;PROD-06;QA_DSM00001pro;QA_DSM00002pro;Mentisan;Decloremaxo;Omparasol",
"availableProductsForRules": "QA_a00U000000PunPcIA;QA_a00U000000PunPvIA;QA_a00U000000PunQ7IA;QA_a00U000000XL37cIA;AKT_ALL_PRODUCTS;a00g000000BoMJfAAN;a00g000000BoMKEAA3;a00g000000BoMKTAA3;PROD-01;PROD-02;PROD-03;PROD-04;PROD-05;PROD-06;QA_DSM00001pro;QA_DSM00002pro;Mentisan;Decloremaxo;Omparasol"
}
],
"localizationPropertyOverrides": {},
"messageStrategies": [],
"segmentFactors": [],
"factors": [
{
"factorTypeId": "emailChannelFactor",
"order": 1,
"remEnabled": "false",
"requirements": "",
"isAnyRuleModified": false,
"disabled": false,
"suggestionTitleMVEL": null,
"insightTitleMVEL": null,
"enhancedInsightTitleMVEL": null,
"segmentFactorIds": null,
"segmentsGroupingCondition": "AND",
"evaluationFrequency": "DAILY",
"name": "Emails Channel",
"description": "Factor that enables generation of token-based insights for suggested email channel actions",
"reasonTemplates": [
{
"tokenizedText": null,
"crmFieldName": "",
"destination": "Suggestion"
},
{
"tokenizedText": null,
"crmFieldName": "",
"destination": "Insight"
},
{
"tokenizedText": null,
"crmFieldName": "",
"destination": "EnhancedInsight"
}
]
},
{
"factorTypeId": "visitChannelFactor",
"order": 2,
"remEnabled": "false",
"requirements": "",
"isAnyRuleModified": false,
"disabled": false,
"suggestionTitleMVEL": null,
"insightTitleMVEL": null,
"enhancedInsightTitleMVEL": null,
"segmentFactorIds": null,
"segmentsGroupingCondition": "AND",
"evaluationFrequency": "DAILY",
"name": "Visit Channel",
"description": "Factor that enables generation of token-based insights for suggested visit actions",
"reasonTemplates": [
{
"tokenizedText": null,
"crmFieldName": "",
"destination": "Suggestion"
},
{
"tokenizedText": null,
"crmFieldName": "",
"destination": "Insight"
},
{
"tokenizedText": null,
"crmFieldName": "",
"destination": "EnhancedInsight"
}
]
},
{
"factorTypeId": "webCallChannelFactor",
"order": 3,
"remEnabled": "false",
"requirements": "",
"isAnyRuleModified": false,
"disabled": false,
"suggestionTitleMVEL": null,
"insightTitleMVEL": null,
"enhancedInsightTitleMVEL": null,
"segmentFactorIds": null,
"segmentsGroupingCondition": "AND",
"evaluationFrequency": "DAILY",
"name": "Web Call Channel",
"description": "Factor that enables generation of token-based insights for suggested web call actions",
"reasonTemplates": [
{
"tokenizedText": null,
"crmFieldName": "",
"destination": "Suggestion"
},
{
"tokenizedText": null,
"crmFieldName": "",
"destination": "Insight"
},
{
"tokenizedText": null,
"crmFieldName": "",
"destination": "EnhancedInsight"
}
]
},
{
"factorTypeId": "suggestionReasonsFactor",
"order": 4,
"remEnabled": "false",
"requirements": "",
"isAnyRuleModified": false,
"disabled": false,
"suggestionTitleMVEL": null,
"insightTitleMVEL": null,
"enhancedInsightTitleMVEL": null,
"segmentFactorIds": null,
"segmentsGroupingCondition": "AND",
"evaluationFrequency": "DAILY",
"name": "Suggestion Reason Factor",
"description": "Factor that enables generation of token-based insights for suggested visit actions",
"reasonTemplates": [
{
"tokenizedText": "",
"crmFieldName": "",
"destination": "Suggestion"
},
{
"tokenizedText": "",
"crmFieldName": "",
"destination": "Insight"
},
{
"tokenizedText": "",
"crmFieldName": "",
"destination": "EnhancedInsight"
}
]
},
{
"factorTypeId": "pacingFactor",
"order": 5,
"id": "d5630ab4-3ade-cbb1-012a-1828eb079f1c",
"masterFactorId": null,
"excludedMasterFactorProductIds": "",
"remEnabled": "false",
"requirements": "",
"isAnyRuleModified": false,
"disabled": false,
"suggestionTitleMVEL": null,
"insightTitleMVEL": null,
"enhancedInsightTitleMVEL": null,
"segmentFactorIds": [],
"segmentsGroupingCondition": "AND",
"evaluationFrequency": "DAILY",
"name": "New Pace & Priority Factor",
"description": "",
"productIds": "AKT_ALL_PRODUCTS;PROD-06;PROD-04;QA_a00U000000PunQ7IA;PROD-01;a00g000000BoMJfAAN;Decloremaxo;QA_DSM00002pro;QA_DSM00001pro;QA_a00U000000PunPvIA;QA_a00U000000XL37cIA;a00g000000BoMKEAA3;Mentisan;PROD-05;Omparasol;PROD-03;QA_a00U000000PunPcIA;PROD-02;a00g000000BoMKTAA3",
"accountPriorityInfluence": "0",
"pacingAcceleration": "-1",
"rules": [
{
"type": "eventFactor",
"comparisonValue1": "0",
"comparisonValue2": "10",
"operator1": ">=",
"operator2": "<=",
"condition": "AND",
"negated": "false",
"fixedDate": null,
"productId": null,
"strict": false,
"includeNullValue": "false",
"nonRule": false,
"ruleUid": "x041f6183a6f36add9ca896ea893a36b4c31a",
"eventTypeId": "VISIT_DETAIL-MISSED",
"linkedRules": []
},
{
"type": "fixedDateFactor",
"comparisonValue1": "0",
"comparisonValue2": "10",
"operator1": ">=",
"operator2": "<=",
"condition": "AND",
"negated": "false",
"fixedDate": "2020-09-24",
"productId": null,
"strict": false,
"includeNullValue": "false",
"nonRule": false,
"ruleUid": "x7a0f1137a1c9aa5eb8a2a61a63487a05954a",
"fixedDateTypeId": "calendarDate",
"linkedRules": []
}
],
"reasonTemplates": [
{
"tokenizedText": null,
"crmFieldName": "",
"destination": "Suggestion"
},
{
"tokenizedText": null,
"crmFieldName": "",
"destination": "Insight"
},
{
"tokenizedText": null,
"crmFieldName": "",
"destination": "EnhancedInsight"
}
]
},
{
"factorTypeId": "notificationFactor",
"order": 6,
"id": "a7217488-1012-a12f-57ac-201d4783aa85",
"masterFactorId": null,
"excludedMasterFactorProductIds": "",
"remEnabled": "false",
"requirements": "",
"isAnyRuleModified": false,
"disabled": false,
"suggestionTitleMVEL": null,
"insightTitleMVEL": null,
"enhancedInsightTitleMVEL": null,
"segmentFactorIds": [],
"segmentsGroupingCondition": "AND",
"evaluationFrequency": "DAILY",
"name": "New Insights Factor",
"description": "",
"productIds": "AKT_ALL_PRODUCTS;PROD-06;PROD-04;QA_a00U000000PunQ7IA;PROD-01;a00g000000BoMJfAAN;Decloremaxo;QA_DSM00002pro;QA_DSM00001pro;QA_a00U000000PunPvIA;QA_a00U000000XL37cIA;a00g000000BoMKEAA3;Mentisan;PROD-05;Omparasol;PROD-03;QA_a00U000000PunPcIA;PROD-02;a00g000000BoMKTAA3",
"rules": [
{
"type": "fixedDateFactor",
"comparisonValue1": "0",
"comparisonValue2": "10",
"operator1": ">=",
"operator2": "<=",
"condition": "AND",
"negated": "false",
"fixedDate": null,
"productId": null,
"strict": false,
"includeNullValue": "false",
"nonRule": false,
"ruleUid": "x2cd90832ae766af58aabb7ca9a3d2b527e6e",
"fixedDateTypeId": "firstOfCurrentMonth",
"linkedRules": []
},
{
"type": "eventFactor",
"comparisonValue1": "15",
"comparisonValue2": "0",
"operator1": ">=",
"operator2": "<=",
"condition": "AND",
"negated": "false",
"fixedDate": null,
"productId": null,
"strict": false,
"includeNullValue": "false",
"nonRule": false,
"ruleUid": "x2159b516a3f12a63bea39b0a1d548ae06b66",
"eventTypeId": "VISIT_DETAIL-PLANNED",
"linkedRules": []
}
],
"tags": [
{
"tagId": 6,
"tagName": "Email consen",
"tagDescription": null,
"tagRank": 1,
"tagType": "USECASE"
}
],
"reasonTemplates": [
{
"tokenizedText": null,
"crmFieldName": "",
"destination": "Suggestion"
},
{
"tokenizedText": null,
"crmFieldName": "",
"destination": "Insight"
},
{
"tokenizedText": null,
"crmFieldName": "",
"destination": "EnhancedInsight"
}
]
},
{
"factorTypeId": "suppressionFactor",
"order": 7,
"id": "9681059a-7842-5c5a-839a-8d056869c01d",
"masterFactorId": null,
"excludedMasterFactorProductIds": "",
"remEnabled": "false",
"requirements": "",
"isAnyRuleModified": false,
"disabled": false,
"suggestionTitleMVEL": null,
"insightTitleMVEL": null,
"enhancedInsightTitleMVEL": null,
"segmentFactorIds": [],
"segmentsGroupingCondition": "AND",
"evaluationFrequency": "DAILY",
"name": "New Suppress Factor",
"description": "",
"actorTypeId": "MSL",
"optionalMessages": "AKT_ALL_PRODUCTS:;PROD-06:;PROD-04:;QA_a00U000000PunQ7IA:;PROD-01:;a00g000000BoMJfAAN:;Decloremaxo:;QA_DSM00002pro:;QA_DSM00001pro:;QA_a00U000000PunPvIA:;QA_a00U000000XL37cIA:;a00g000000BoMKEAA3:;Mentisan:;PROD-05:;Omparasol:;PROD-03:;QA_a00U000000PunPcIA:;PROD-02:;a00g000000BoMKTAA3:",
"productIds": "AKT_ALL_PRODUCTS;PROD-06;PROD-04;QA_a00U000000PunQ7IA;PROD-01;a00g000000BoMJfAAN;Decloremaxo;QA_DSM00002pro;QA_DSM00001pro;QA_a00U000000PunPvIA;QA_a00U000000XL37cIA;a00g000000BoMKEAA3;Mentisan;PROD-05;Omparasol;PROD-03;QA_a00U000000PunPcIA;PROD-02;a00g000000BoMKTAA3",
"channelId": "VISIT_CHANNEL",
"suppressedDestination": "Insight",
"rules": [
{
"type": "eventFactor",
"comparisonValue1": "15",
"comparisonValue2": "0",
"operator1": ">=",
"operator2": "<=",
"condition": "AND",
"negated": "false",
"fixedDate": null,
"productId": "QA_a00U000000PunPcIA",
"strict": true,
"includeNullValue": "false",
"nonRule": false,
"ruleUid": "x788f8a69a3395a2389af7c5a4141522e7b77",
"eventTypeId": "VISIT_DETAIL-MISSED",
"linkedRules": []
},
{
"type": "metricFactor",
"comparisonValue1": "A|B|C",
"comparisonValue2": null,
"operator1": "all of",
"operator2": "",
"condition": "",
"negated": "false",
"fixedDate": null,
"productId": "QA_a00U000000PunPcIA",
"strict": true,
"includeNullValue": "false",
"nonRule": false,
"ruleUid": "x27757fa3a8b2ca2135a179da15b65464b9fb",
"metricTypeId": "hcpSegment_std_akt",
"linkedRules": []
},
{
"type": "labelValueMetricFactor",
"comparisonValue1": "0",
"comparisonValue2": null,
"operator1": ">",
"operator2": "",
"condition": "",
"negated": "false",
"fixedDate": null,
"productId": "QA_a00U000000PunPvIA",
"strict": true,
"includeNullValue": "false",
"nonRule": false,
"ruleUid": "xaf7109d7ae861aff4faf78ea1696a5e6c298",
"labelValueMetricTypeId": "MONTHLY_SALES",
"linkedRules": [
{
"type": "labelValueMetricFactor",
"comparisonValue1": "0",
"comparisonValue2": null,
"operator1": ">",
"operator2": "",
"condition": "",
"negated": "false",
"fixedDate": null,
"productId": null,
"strict": false,
"includeNullValue": "false",
"nonRule": false,
"labelValueMetricTypeId": "value"
}
]
}
],
"tags": [
{
"tagId": 89,
"tagName": "Handover from field to MA",
"tagDescription": null,
"tagRank": 1,
"tagType": "USECASE"
}
],
"reasonTemplates": [
{
"tokenizedText": "",
"crmFieldName": "",
"destination": "Suggestion"
},
{
"tokenizedText": "",
"crmFieldName": "",
"destination": "Insight"
},
{
"tokenizedText": "",
"crmFieldName": "",
"destination": "EnhancedInsight"
}
]
},
{
"factorTypeId": "triggerFactor",
"order": 8,
"id": "58afd459-1d9d-a15e-b471-ff7b8be219cc",
"masterFactorId": null,
"excludedMasterFactorProductIds": "",
"remEnabled": "false",
"requirements": "",
"isAnyRuleModified": false,
"disabled": false,
"suggestionTitleMVEL": null,
"insightTitleMVEL": null,
"enhancedInsightTitleMVEL": null,
"segmentFactorIds": [],
"segmentsGroupingCondition": "AND",
"evaluationFrequency": "DAILY",
"name": "New Trigger Factor",
"description": "",
"actorTypeId": "FieldRep",
"optionalMessages": "AKT_ALL_PRODUCTS:;PROD-06:;PROD-04:;QA_a00U000000PunQ7IA:;PROD-01:;a00g000000BoMJfAAN:;Decloremaxo:;QA_DSM00002pro:;QA_DSM00001pro:;QA_a00U000000PunPvIA:;QA_a00U000000XL37cIA:;a00g000000BoMKEAA3:;Mentisan:;PROD-05:;Omparasol:;PROD-03:;QA_a00U000000PunPcIA:;PROD-02:;a00g000000BoMKTAA3:",
"actionTypeId": "VISIT_DETAIL",
"productIds": "AKT_ALL_PRODUCTS;PROD-06;PROD-04;QA_a00U000000PunQ7IA;PROD-01;a00g000000BoMJfAAN;Decloremaxo;QA_DSM00002pro;QA_DSM00001pro;QA_a00U000000PunPvIA;QA_a00U000000XL37cIA;a00g000000BoMKEAA3;Mentisan;PROD-05;Omparasol;PROD-03;QA_a00U000000PunPcIA;PROD-02;a00g000000BoMKTAA3",
"channelId": "VISIT_CHANNEL",
"optionalMessageSet": "AKT_ALL_PRODUCTS:;PROD-06:;PROD-04:;QA_a00U000000PunQ7IA:;PROD-01:;a00g000000BoMJfAAN:;Decloremaxo:;QA_DSM00002pro:;QA_DSM00001pro:;QA_a00U000000PunPvIA:;QA_a00U000000XL37cIA:;a00g000000BoMKEAA3:;Mentisan:;PROD-05:;Omparasol:;PROD-03:;QA_a00U000000PunPcIA:;PROD-02:;a00g000000BoMKTAA3:",
"rules": [
{
"type": "eventFactor",
"comparisonValue1": "0",
"comparisonValue2": "0",
"operator1": ">=",
"operator2": "<=",
"condition": "AND",
"negated": "false",
"fixedDate": null,
"productId": null,
"strict": false,
"includeNullValue": "false",
"nonRule": false,
"ruleUid": "x81c65090a331cabb03a81f9a57f163a91e49",
"eventTypeId": "VISIT_DETAIL-PLANNED",
"linkedRules": []
}
],
"tags": [
{
"tagId": 6,
"tagName": "Email consen",
"tagDescription": null,
"tagRank": 1,
"tagType": "USECASE"
}
],
"reasonTemplates": [
{
"tokenizedText": null,
"crmFieldName": "",
"destination": "Suggestion"
},
{
"tokenizedText": null,
"crmFieldName": "",
"destination": "Insight"
},
{
"tokenizedText": null,
"crmFieldName": "",
"destination": "EnhancedInsight"
}
]
},
{
"factorTypeId": "triggerFactor",
"order": 8,
"id": "58afd459-1234-5678-90ab-ff7b8be219cc",
"masterFactorId": null,
"excludedMasterFactorProductIds": "",
"remEnabled": "false",
"requirements": "",
"isAnyRuleModified": false,
"disabled": false,
"suggestionTitleMVEL": null,
"insightTitleMVEL": null,
"enhancedInsightTitleMVEL": null,
"segmentFactorIds": [],
"segmentsGroupingCondition": "AND",
"evaluationFrequency": "DAILY",
"name": "New Trigger Factor",
"description": "",
"actorTypeId": "FieldRep",
"actionTypeId": "VISIT_DETAIL",
"productIds": "AKT_ALL_PRODUCTS;PROD-06;PROD-04;QA_a00U000000PunQ7IA;PROD-01;a00g000000BoMJfAAN;Decloremaxo;QA_DSM00002pro;QA_DSM00001pro;QA_a00U000000PunPvIA;QA_a00U000000XL37cIA;a00g000000BoMKEAA3;Mentisan;PROD-05;Omparasol;PROD-03;QA_a00U000000PunPcIA;PROD-02;a00g000000BoMKTAA3",
"channelId": "VISIT_CHANNEL",
"optionalMessages": "AKT_ALL_PRODUCTS:;PROD-06:;PROD-04:;QA_a00U000000PunQ7IA:;PROD-01:;a00g000000BoMJfAAN:;Decloremaxo:;QA_DSM00002pro:;QA_DSM00001pro:;QA_a00U000000PunPvIA:;QA_a00U000000XL37cIA:;a00g000000BoMKEAA3:;Mentisan:;PROD-05:;Omparasol:;PROD-03:;QA_a00U000000PunPcIA:;PROD-02:;a00g000000BoMKTAA3:",
"optionalMessageSet": "AKT_ALL_PRODUCTS:;PROD-06:;PROD-04:;QA_a00U000000PunQ7IA:;PROD-01:;a00g000000BoMJfAAN:;Decloremaxo:;QA_DSM00002pro:;QA_DSM00001pro:;QA_a00U000000PunPvIA:;QA_a00U000000XL37cIA:;a00g000000BoMKEAA3:;Mentisan:;PROD-05:;Omparasol:;PROD-03:;QA_a00U000000PunPcIA:;PROD-02:;a00g000000BoMKTAA3:",
"rules": [
{
"type": "eventFactor",
"comparisonValue1": "0",
"comparisonValue2": "0",
"operator1": ">=",
"operator2": "<=",
"condition": "AND",
"negated": "false",
"fixedDate": null,
"productId": null,
"strict": false,
"includeNullValue": "false",
"nonRule": false,
"ruleUid": "x81c65090a331cabb03a81f9a57f163a91e49",
"eventTypeId": "VISIT_DETAIL-PLANNED",
"linkedRules": []
}
],
"tags": [
{
"tagId": 6,
"tagName": "Email consen",
"tagDescription": null,
"tagRank": 1,
"tagType": "USECASE"
}
],
"reasonTemplates": [
{
"tokenizedText": null,
"crmFieldName": "",
"destination": "Suggestion"
},
{
"tokenizedText": null,
"crmFieldName": "",
"destination": "Insight"
},
{
"tokenizedText": null,
"crmFieldName": "",
"destination": "EnhancedInsight"
}
]
}
]
},
"directory": null,
"configLock": {
"lockUID": "",
"entityId": "210-2",
"lockOwner": "demo",
"lockOwnerName": "demo",
"lockExpiration": "2020-09-28T18:01:24Z",
"disableConfigLocking": "false"
}
}`);
var myCopy = null;
var clone = (function() {
'use strict';
function _instanceof(obj, type) {
return type != null && obj instanceof type;
}
var nativeMap;
try {
nativeMap = Map;
} catch(_) {
// maybe a reference error because no `Map`. Give it a dummy value that no
// value will ever be an instanceof.
nativeMap = function() {};
}
var nativeSet;
try {
nativeSet = Set;
} catch(_) {
nativeSet = function() {};
}
var nativePromise;
try {
nativePromise = Promise;
} catch(_) {
nativePromise = function() {};
}
/**
* Clones (copies) an Object using deep copying.
*
* This function supports circular references by default, but if you are certain
* there are no circular references in your object, you can save some CPU time
* by calling clone(obj, false).
*
* Caution: if `circular` is false and `parent` contains circular references,
* your program may enter an infinite loop and crash.
*
* @param `parent` - the object to be cloned
* @param `circular` - set to true if the object to be cloned may contain
* circular references. (optional - true by default)
* @param `depth` - set to a number if the object is only to be cloned to
* a particular depth. (optional - defaults to Infinity)
* @param `prototype` - sets the prototype to be used when cloning an object.
* (optional - defaults to parent prototype).
* @param `includeNonEnumerable` - set to true if the non-enumerable properties
* should be cloned as well. Non-enumerable properties on the prototype
* chain will be ignored. (optional - false by default)
*/
function clone(parent, circular, depth, prototype, includeNonEnumerable) {
if (typeof circular === 'object') {
depth = circular.depth;
prototype = circular.prototype;
includeNonEnumerable = circular.includeNonEnumerable;
circular = circular.circular;
}
// maintain two arrays for circular references, where corresponding parents
// and children have the same index
var allParents = [];
var allChildren = [];
var useBuffer = typeof Buffer != 'undefined';
if (typeof circular == 'undefined')
circular = true;
if (typeof depth == 'undefined')
depth = Infinity;
// recurse this function so we don't reset allParents and allChildren
function _clone(parent, depth) {
// cloning null always returns null
if (parent === null)
return null;
if (depth === 0)
return parent;
var child;
var proto;
if (typeof parent != 'object') {
return parent;
}
if (_instanceof(parent, nativeMap)) {
child = new nativeMap();
} else if (_instanceof(parent, nativeSet)) {
child = new nativeSet();
} else if (_instanceof(parent, nativePromise)) {
child = new nativePromise(function (resolve, reject) {
parent.then(function(value) {
resolve(_clone(value, depth - 1));
}, function(err) {
reject(_clone(err, depth - 1));
});
});
} else if (clone.__isArray(parent)) {
child = [];
} else if (clone.__isRegExp(parent)) {
child = new RegExp(parent.source, __getRegExpFlags(parent));
if (parent.lastIndex) child.lastIndex = parent.lastIndex;
} else if (clone.__isDate(parent)) {
child = new Date(parent.getTime());
} else if (useBuffer && Buffer.isBuffer(parent)) {
if (Buffer.from) {
// Node.js >= 5.10.0
child = Buffer.from(parent);
} else {
// Older Node.js versions
child = new Buffer(parent.length);
parent.copy(child);
}
return child;
} else if (_instanceof(parent, Error)) {
child = Object.create(parent);
} else {
if (typeof prototype == 'undefined') {
proto = Object.getPrototypeOf(parent);
child = Object.create(proto);
}
else {
child = Object.create(prototype);
proto = prototype;
}
}
if (circular) {
var index = allParents.indexOf(parent);
if (index != -1) {
return allChildren[index];
}
allParents.push(parent);
allChildren.push(child);
}
if (_instanceof(parent, nativeMap)) {
parent.forEach(function(value, key) {
var keyChild = _clone(key, depth - 1);
var valueChild = _clone(value, depth - 1);
child.set(keyChild, valueChild);
});
}
if (_instanceof(parent, nativeSet)) {
parent.forEach(function(value) {
var entryChild = _clone(value, depth - 1);
child.add(entryChild);
});
}
for (var i in parent) {
var attrs = Object.getOwnPropertyDescriptor(parent, i);
if (attrs) {
child[i] = _clone(parent[i], depth - 1);
}
try {
var objProperty = Object.getOwnPropertyDescriptor(parent, i);
if (objProperty.set === 'undefined') {
// no setter defined. Skip cloning this property
continue;
}
child[i] = _clone(parent[i], depth - 1);
} catch(e){
if (e instanceof TypeError) {
// when in strict mode, TypeError will be thrown if child[i] property only has a getter
// we can't do anything about this, other than inform the user that this property cannot be set.
continue
} else if (e instanceof ReferenceError) {
//this may happen in non strict mode
continue
}
}
}
if (Object.getOwnPropertySymbols) {
var symbols = Object.getOwnPropertySymbols(parent);
for (var i = 0; i < symbols.length; i++) {
// Don't need to worry about cloning a symbol because it is a primitive,
// like a number or string.
var symbol = symbols[i];
var descriptor = Object.getOwnPropertyDescriptor(parent, symbol);
if (descriptor && !descriptor.enumerable && !includeNonEnumerable) {
continue;
}
child[symbol] = _clone(parent[symbol], depth - 1);
Object.defineProperty(child, symbol, descriptor);
}
}
if (includeNonEnumerable) {
var allPropertyNames = Object.getOwnPropertyNames(parent);
for (var i = 0; i < allPropertyNames.length; i++) {
var propertyName = allPropertyNames[i];
var descriptor = Object.getOwnPropertyDescriptor(parent, propertyName);
if (descriptor && descriptor.enumerable) {
continue;
}
child[propertyName] = _clone(parent[propertyName], depth - 1);
Object.defineProperty(child, propertyName, descriptor);
}
}
return child;
}
return _clone(parent, depth);
}
/**
* Simple flat clone using prototype, accepts only objects, usefull for property
* override on FLAT configuration object (no nested props).
*
* USE WITH CAUTION! This may not behave as you wish if you do not know how this
* works.
*/
clone.clonePrototype = function clonePrototype(parent) {
if (parent === null)
return null;
var c = function () {};
c.prototype = parent;
return new c();
};
// private utility functions
function __objToStr(o) {
return Object.prototype.toString.call(o);
}
clone.__objToStr = __objToStr;
function __isDate(o) {
return typeof o === 'object' && __objToStr(o) === '[object Date]';
}
clone.__isDate = __isDate;
function __isArray(o) {
return typeof o === 'object' && __objToStr(o) === '[object Array]';
}
clone.__isArray = __isArray;
function __isRegExp(o) {
return typeof o === 'object' && __objToStr(o) === '[object RegExp]';
}
clone.__isRegExp = __isRegExp;
function __getRegExpFlags(re) {
var flags = '';
if (re.global) flags += 'g';
if (re.ignoreCase) flags += 'i';
if (re.multiline) flags += 'm';
return flags;
}
clone.__getRegExpFlags = __getRegExpFlags;
return clone;
})();
if (typeof module === 'object' && module.exports) {
module.exports = clone;
}
myCopy = _.cloneDeep(MyObject);
myCopy = structuredClone(MyObject);
myCopy = clone(MyObject);
--enable-precise-memory-info
flag.
Test case name | Result |
---|---|
Lodash cloneDeep | |
Native structuredClone | |
clone(); |
Test name | Executions per second |
---|---|
Lodash cloneDeep | 8119.7 Ops/sec |
Native structuredClone | 9611.1 Ops/sec |
clone(); | 1897.9 Ops/sec |
Based on the provided benchmark data, I'll provide an analysis of the results:
structuredClone
method, with an execution rate of 8119.73974609375 executions per second.clone()
function has the lowest execution rate at 1897.931640625 executions per second.These results suggest that the structuredClone
method is generally faster than both Lodash's cloneDeep
and the custom clone()
function for deep cloning objects.