tiny-is-equal
Version:
Tiny & Fast is-equal check with various ES6 objects.
1 lines • 1.37 kB
JavaScript
let e=(r,t)=>{if(r===t||Object.is(r,t))return!0;if(typeof r!=typeof t)return!1;if(Array.isArray(r)&&Array.isArray(t)){if(r.length!==t.length)return!1;for(let n=0;n<r.length;n++)if(!e(r[n],t[n]))return!1;return!0}if(r.constructor!==t.constructor)return!1;switch(r.constructor){case Date:return r.valueOf()===t.valueOf();case Set:if(r.size!==t.size)return!1;for(let n of r)if("object"==typeof n&&null!==n){let r=!1;for(let f of t)if("object"==typeof f&&e(n,f)){r=!0;break}if(!r)return!1}else if(!t.has(n))return!1;return!0;case Map:if(r.size!==t.size)return!1;for(let[n,f]of r)if(!t.has(n)||!e(f,t.get(n)))return!1;return!0;case RegExp:return r.source===t.source&&r.flags===t.flags;case ArrayBuffer:if(r.byteLength!==t.byteLength)return!1;return e(new Uint8Array(r),new Uint8Array(t));case Error:return r.name===t.name&&r.message===t.message;case DataView:if(r.byteLength!==t.byteLength||r.byteOffset!==t.byteOffset)return!1;for(let e=0;e<r.byteLength;e++)if(r.getUint8(e)!==t.getUint8(e))return!1;return!0;case Function:return r.toString()===t.toString();case Object:if(Object.keys(r).length!==Object.keys(t).length)return!1;for(let n in r)if(!Object.hasOwn(t,n)||!e(r[n],t[n]))return!1;return!0;default:if(ArrayBuffer.isView(r)){if(r.length!==t.length)return!1;for(let e=0;e<r.length;e++)if(r[e]!==t[e])return!1;return!0}}return r!=r&&t!=t},r=e;export{r as default};