UNPKG

rambda

Version:

Lightweight faster alternative to Ramda

102 lines (76 loc) 2.34 kB
import { type } from './type' function parseError(maybeError){ const typeofError = maybeError.__proto__.toString() if (![ 'Error', 'TypeError' ].includes(typeofError)) return [] return [ typeofError, maybeError.message ] } function parseDate(maybeDate){ if (!maybeDate.toDateString) return [ false ] return [ true, maybeDate.getTime() ] } function parseRegex(maybeRegex){ if (maybeRegex.constructor !== RegExp) return [ false ] return [ true, maybeRegex.toString() ] } export function equals(a, b){ if (arguments.length === 1) return _b => equals(a, _b) const aType = type(a) if (aType !== type(b)) return false if ([ 'NaN', 'Undefined', 'Null' ].includes(aType)) return true if ([ 'Boolean', 'Number', 'String' ].includes(aType)) return a.toString() === b.toString() if (aType === 'Array'){ const aClone = Array.from(a) const bClone = Array.from(b) if (aClone.toString() !== bClone.toString()){ return false } let loopArrayFlag = true aClone.forEach((aCloneInstance, aCloneIndex) => { if (loopArrayFlag){ if ( aCloneInstance !== bClone[ aCloneIndex ] && !equals(aCloneInstance, bClone[ aCloneIndex ]) ){ loopArrayFlag = false } } }) return loopArrayFlag } const aRegex = parseRegex(a) const bRegex = parseRegex(b) if (aRegex[ 0 ]){ return bRegex[ 0 ] ? aRegex[ 1 ] === bRegex[ 1 ] : false } else if (bRegex[ 0 ]) return false const aDate = parseDate(a) const bDate = parseDate(b) if (aDate[ 0 ]){ return bDate[ 0 ] ? aDate[ 1 ] === bDate[ 1 ] : false } else if (bDate[ 0 ]) return false const aError = parseError(a) const bError = parseError(b) if (aError[ 0 ]){ return bError[ 0 ] ? aError[ 0 ] === bError[ 0 ] && aError[ 1 ] === bError[ 1 ] : false } if (aType === 'Object'){ const aKeys = Object.keys(a) if (aKeys.length !== Object.keys(b).length){ return false } let loopObjectFlag = true aKeys.forEach(aKeyInstance => { if (loopObjectFlag){ const aValue = a[ aKeyInstance ] const bValue = b[ aKeyInstance ] if (aValue !== bValue && !equals(aValue, bValue)){ loopObjectFlag = false } } }) return loopObjectFlag } return false }