48 lines
1.1 KiB
JavaScript
48 lines
1.1 KiB
JavaScript
function deepEqual (prev, current) {
|
|
if (prev === current) { // 基本类型比较,值,类型都相同 或者同为 null or undefined
|
|
return true;
|
|
}
|
|
|
|
if ((!prev && current)
|
|
|| (prev && !current)
|
|
|| (!prev && !current)
|
|
) {
|
|
return false;
|
|
}
|
|
|
|
if (Array.isArray(prev)) {
|
|
if (!Array.isArray(current)) return false;
|
|
if (prev.length !== current.length) return false;
|
|
|
|
for (let i = 0; i < prev.length; i++) {
|
|
if (!deepEqual(current[i], prev[i])) {
|
|
return false;
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
|
|
if (typeof current === 'object') {
|
|
if (typeof prev !== 'object') return false;
|
|
const prevKeys = Object.keys(prev);
|
|
const curKeys = Object.keys(current);
|
|
|
|
if (prevKeys.length !== curKeys.length) return false;
|
|
|
|
prevKeys.sort();
|
|
curKeys.sort();
|
|
|
|
for (let i = 0; i < prevKeys.length; i++) {
|
|
if (prevKeys[i] !== curKeys[i]) return false;
|
|
const key = prevKeys[i];
|
|
if (!deepEqual(prev[key], current[key])) return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
export default deepEqual;
|