/** ***************************************** * Created by edonet@163.com * Created on 2021-01-14 22:35:00 ***************************************** */ 'use strict'; /** ***************************************** * 判断值是否相等 ***************************************** */ export function equal(d1: T, d2: T): boolean { // 绝对相等 if (d1 === d2) { return true; } // 比较非对象 if (typeof d1 !== 'object' || typeof d2 !== 'object') { if (typeof d1 === 'number' && isNaN(d1)) { return typeof d2 === 'number' && isNaN(d2); } else { return false; } } // 比较空 if (d1 === null || d2 === null) { return false; } // 比较原型对象是否同 if (Object.getPrototypeOf && Object.getPrototypeOf(d1) !== Object.getPrototypeOf(d2)) { return false; } // 比较数组 if (Array.isArray(d1)) { if (!Array.isArray(d2) || d1.length !== d2.length) { return false; } // 比较元素 return d1.every((val, idx) => equal(val, d2[idx])); } // 比较日期对象 if (d1 instanceof Date) { return d2 instanceof Date && d1.getTime() - d2.getTime() === 0; } // 比较集合 if (d1 instanceof Set) { if (!(d2 instanceof Set) || d1.size !== d2.size) { return false; } // 比较元素 return [...d1].every(val => d2.has(val)); } // 比较映射 if (d1 instanceof Map) { if (!(d2 instanceof Map) || d1.size !== d2.size) { return false; } // 比较元素 return [...d1.keys()].every(key => equal(d1.get(key), d2.get(key))); } // 获取对象的键 const k1 = Object.keys(d1); const k2 = Object.keys(d2); // 比较键长度 if (k1.length !== k2.length) { return false; } // 对比值 return k1.every( key => equal(d1[key as keyof T], d2[key as keyof T]) ); }