12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394 |
- 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 = <T extends Array<any>>(
- 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,
- };
- };
|