UNPKG

@newdash/newdash

Version:

javascript/typescript utility library

71 lines (67 loc) 1.81 kB
"use strict"; /* 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;