UNPKG

@andranik-arakelyan/js-utilities

Version:
1 lines 1.71 kB
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.jsonCompare=jsonCompare;function getValueType(value){if(value===null)return"null";if(Array.isArray(value))return"array";return typeof value}function compareObjects(base,compared,objectIndex,differences,currentPath=""){if(base===null||base===undefined||compared===null||compared===undefined){return}if(typeof base!=="object"||Array.isArray(base)){return}if(typeof compared!=="object"||Array.isArray(compared)){return}const baseKeys=Object.keys(base);const comparedKeys=Object.keys(compared);const allKeys=new Set([...baseKeys,...comparedKeys]);for(const key of allKeys){const keyPath=currentPath?`${currentPath}.${key}`:key;const hasInBase=key in base;const hasInCompared=key in compared;if(hasInBase&&!hasInCompared){differences.push({objectIndex:objectIndex,diffType:"missing_key",keyPath:keyPath,baseValueType:getValueType(base[key])})}else if(!hasInBase&&hasInCompared){differences.push({objectIndex:objectIndex,diffType:"extra_key",keyPath:keyPath,comparedValueType:getValueType(compared[key])})}else if(hasInBase&&hasInCompared){const baseValueType=getValueType(base[key]);const comparedValueType=getValueType(compared[key]);if(baseValueType!==comparedValueType){differences.push({objectIndex:objectIndex,diffType:"type_mismatch",keyPath:keyPath,baseValueType:baseValueType,comparedValueType:comparedValueType})}else if(baseValueType==="object"&&comparedValueType==="object"){compareObjects(base[key],compared[key],objectIndex,differences,keyPath)}}}}function jsonCompare(base,comparisons){const differences=[];comparisons.forEach(((comparison,index)=>{compareObjects(base,comparison,index,differences)}));return differences}