import { toRawType } from "./basic"; // 是否修改 const _deepIsRevise = ( raw1: any, raw2: any, readly: Set<[any, any]> ): boolean => { if (raw1 === raw2) return false; const rawType1 = toRawType(raw1); const rawType2 = toRawType(raw2); if (rawType1 !== rawType2) { return true; } else if ( rawType1 === "String" || rawType1 === "Number" || rawType1 === "Boolean" ) { if (rawType1 === "Number" && isNaN(raw1) && isNaN(raw2)) { return false; } else { return raw1 !== raw2; } } const rawsArray = Array.from(readly.values()); for (const raws of rawsArray) { if (raws.includes(raw1) && raws.includes(raw2)) { return false; } } readly.add([raw1, raw2]); if (rawType1 === "Array") { return ( raw1.length !== raw2.length || raw1.some((item1: any, i: number) => _deepIsRevise(item1, raw2[i], readly) ) ); } else if (rawType1 === "Object") { const rawKeys1 = Object.keys(raw1).sort(); const rawKeys2 = Object.keys(raw2).sort(); return ( _deepIsRevise(rawKeys1, rawKeys2, readly) || rawKeys1.some((key) => _deepIsRevise(raw1[key], raw2[key], readly)) ); } else if (rawType1 === "Map") { const rawKeys1 = Array.from(raw1.keys()).sort(); const rawKeys2 = Array.from(raw2.keys()).sort(); return ( _deepIsRevise(rawKeys1, rawKeys2, readly) || rawKeys1.some((key) => _deepIsRevise(raw1.get(key), raw2.get(key), readly) ) ); } else if (rawType1 === "Set") { return deepIsRevise(Array.from(raw1.values()), Array.from(raw2.values())); } else { return raw1 !== raw2; } }; export const deepIsRevise = (raw1: any, raw2: any) => _deepIsRevise(raw1, raw2, new Set()); export const diffArrayChange = >( newItems: T, oldItems: T ) => { const addedItems = [] as unknown as T; const deletedItems = [] as unknown as T; for (const item of newItems) { if (!oldItems.includes(item)) { addedItems.push(item); } } for (const item of oldItems) { if (!newItems.includes(item)) { deletedItems.push(item); } } return { added: addedItems, deleted: deletedItems, }; };