Преглед на файлове

perf: replace `Array#map` `Array#filter` chain w/ `Array#reduce` (#1203)

Sukka преди 11 месеца
родител
ревизия
0332415ac9
променени са 3 файла, в които са добавени 59 реда и са изтрити 37 реда
  1. 5 5
      src/pages/logs.tsx
  2. 38 15
      src/services/api.ts
  3. 16 17
      src/services/cmds.ts

+ 5 - 5
src/pages/logs.tsx

@@ -24,11 +24,11 @@ const LogPage = () => {
   const [match, setMatch] = useState(() => (_: string) => true);
 
   const filterLogs = useMemo(() => {
-    return logData
-      .filter((data) =>
-        logState === "all" ? true : data.type.includes(logState)
-      )
-      .filter((data) => match(data.payload));
+    return logData.filter(
+      (data) =>
+        (logState === "all" ? true : data.type.includes(logState)) &&
+        match(data.payload)
+    );
   }, [logData, logState, match]);
 
   return (

+ 38 - 15
src/services/api.ts

@@ -134,25 +134,48 @@ export const getProxies = async () => {
 
   const { GLOBAL: global, DIRECT: direct, REJECT: reject } = proxyRecord;
 
-  let groups = Object.values(proxyRecord)
-    .filter((each) => each.name !== "GLOBAL" && each.all)
-    .map((each) => ({
-      ...each,
-      all: each.all!.map((item) => generateItem(item)),
-    }));
+  interface Group {
+    all: IProxyItem[];
+    name: string;
+    type: string;
+    udp: boolean;
+    xudp: boolean;
+    tfo: boolean;
+    history: {
+      time: string;
+      delay: number;
+    }[];
+  }
+
+  let groups: Group[] = Object.values(proxyRecord).reduce<Group[]>(
+    (acc, each) => {
+      if (each.name !== "GLOBAL" && each.all) {
+        acc.push({
+          ...each,
+          all: each.all!.map((item) => generateItem(item)),
+        });
+      }
+
+      return acc;
+    },
+    []
+  );
 
   if (global?.all) {
-    let globalGroups = global.all
-      .filter((name) => proxyRecord[name]?.all)
-      .map((name) => proxyRecord[name])
-      .map((each) => ({
-        ...each,
-        all: each.all!.map((item) => generateItem(item)),
-      }));
-    let globalNames = globalGroups.map((each) => each.name);
+    let globalGroups: Group[] = global.all.reduce<Group[]>((acc, name) => {
+      if (proxyRecord[name]?.all) {
+        acc.push({
+          ...proxyRecord[name],
+          all: proxyRecord[name].all!.map((item) => generateItem(item)),
+        });
+      }
+      return acc;
+    }, []);
+
+    let globalNames = new Set(globalGroups.map((each) => each.name));
     groups = groups
       .filter((group) => {
-        return !globalNames.includes(group.name);
+        return !globalNames.has(group.name);
       })
       .concat(globalGroups);
   }

+ 16 - 17
src/services/cmds.ts

@@ -7,23 +7,22 @@ export async function getClashLogs() {
   const newRegex = /(.+?)\s+(.+?)\s+(.+)/;
   const logs = await invoke<string[]>("get_clash_logs");
 
-  return logs
-    .map((log) => {
-      const result = log.match(regex);
-      if (result) {
-        const [_, _time, type, payload] = result;
-        const time = dayjs(_time).format("MM-DD HH:mm:ss");
-        return { time, type, payload };
-      }
-
-      const result2 = log.match(newRegex);
-      if (result2) {
-        const [_, time, type, payload] = result2;
-        return { time, type, payload };
-      }
-      return null;
-    })
-    .filter(Boolean) as ILogItem[];
+  return logs.reduce<ILogItem[]>((acc, log) => {
+    const result = log.match(regex);
+    if (result) {
+      const [_, _time, type, payload] = result;
+      const time = dayjs(_time).format("MM-DD HH:mm:ss");
+      acc.push({ time, type, payload });
+      return acc;
+    }
+
+    const result2 = log.match(newRegex);
+    if (result2) {
+      const [_, time, type, payload] = result2;
+      acc.push({ time, type, payload });
+    }
+    return acc;
+  }, []);
 }
 
 export async function getProfiles() {