@newdash/newdash
Version:
javascript/typescript utility library
71 lines (67 loc) • 1.81 kB
JavaScript
;
/*
Heavily inspired by SOW Article
ref link: https://stackoverflow.com/a/47941092/4380476
Author: Antonio Narkevich
LICENSE: CC BY-SA 3.0
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.isCircular = exports.getObjectCycles = void 0;
const S_ROOT_OBJECT = "ROOT";
/**
* get all circular reference
*
* @since 5.18.0
* @category Object
* @param object
* @returns
*/
function getObjectCycles(object) {
if (object === undefined || object === null) {
return [];
}
/**
* key: object
* value: path
*/
const traversedProps = new Map();
const cycles = [];
const traverse = function (currentObj, currentPath = S_ROOT_OBJECT) {
if (currentObj === null || currentObj === undefined) {
return;
}
if (traversedProps.has(currentObj)) {
cycles.push([currentPath, traversedProps.get(currentObj)]);
return;
}
traversedProps.set(currentObj, currentPath);
for (const key in currentObj) {
const value = currentObj[key];
const valuePath = `${currentPath}['${key}']`;
if (Object?.prototype?.hasOwnProperty?.call(currentObj, key) && value) {
traverse(value, valuePath);
}
}
};
traverse(object);
traversedProps.clear();
return cycles;
}
exports.getObjectCycles = getObjectCycles;
;
/**
* given an object, check wether the object has circular reference or not
*
* @since 5.18.0
* @category Object
* @returns truth if the given object has circular reference
*/
function isCircular(obj) {
const cycle = getObjectCycles(obj);
if (cycle.length > 0) {
return true;
}
return false;
}
exports.isCircular = isCircular;
exports.default = isCircular;