export const get = (obj: any, path: string, defaultValue = undefined) => { const travel = (regexp: RegExp) => String.prototype.split .call(path, regexp) .filter(Boolean) .reduce( (res, key) => (res !== null && res !== undefined ? res[key] : res), obj ); const result = travel(/[,[\]]+?/) || travel(/[,[\].]+?/); return result === undefined || result === obj ? defaultValue : result; }; export function isEqual(obj1: any, obj2: any): boolean { // Kiểm tra cùng tham chiếu if (obj1 === obj2) { return true; } // Kiểm tra kiểu dữ liệu if (typeof obj1 !== typeof obj2) { return false; } // Kiểm tra null và undefined if (obj1 == null || obj2 == null) { return obj1 === obj2; } // Kiểm tra kiểu dữ liệu cụ thể const type1 = Object.prototype.toString.call(obj1); const type2 = Object.prototype.toString.call(obj2); if (type1 !== type2) { return false; } // Kiểm tra từng trường hợp cụ thể if (type1 === '[object Array]') { if (obj1.length !== obj2.length) { return false; } for (let i = 0; i < obj1.length; i++) { if (!isEqual(obj1[i], obj2[i])) { return false; } } return true; } if (type1 === '[object Object]') { const keys1 = Object.keys(obj1); const keys2 = Object.keys(obj2); if (keys1.length !== keys2.length) { return false; } for (const key of keys1) { if (!isEqual(obj1[key], obj2[key])) { return false; } } return true; } // Kiểm tra giá trị nguyên thủy và các kiểu dữ liệu khác return obj1 === obj2; }