fix: merge daily data and original data properly

This commit is contained in:
Starcea 2024-07-16 17:12:04 +09:00
commit 1b57aad7af
No known key found for this signature in database
GPG key ID: B7A77E32374911E1
2 changed files with 29 additions and 17 deletions

View file

@ -5,6 +5,7 @@ import School from './models/School'
import type { Timetable } from './models/Timetable' import type { Timetable } from './models/Timetable'
import { encodeBase64, encodeEUCKR } from './utils/encode' import { encodeBase64, encodeEUCKR } from './utils/encode'
import { parseResponse } from './utils/parse' import { parseResponse } from './utils/parse'
import { mergeMap } from './utils/array'
export default class Comcigan { export default class Comcigan {
private readonly rest = axios.create({ private readonly rest = axios.create({
@ -56,29 +57,29 @@ export default class Comcigan {
const teachersLen = Math.floor(Math.log10(teachers.length - 1)) + 1 const teachersLen = Math.floor(Math.log10(teachers.length - 1)) + 1
const subjects = data[`자료${subjectCode}`] as string[] const subjects = data[`자료${subjectCode}`] as string[]
const original = data[`자료${originalCode}`] as (number | undefined)[][][][] const original = data[`자료${originalCode}`] as number[][][][]
const day = data[`자료${dayCode}`] as number[][][][] const now = data[`자료${dayCode}`] as number[][][][]
const getSubject = (code: number) => const getSubject = (code?: number) =>
subjects[Number(code.toString().slice(0, -teachersLen - 1))] code
const getTeacher = (code: number) => ? subjects[Number(code.toString().slice(0, -teachersLen - 1))]
teachers[Number(code.toString().slice(-teachersLen))] : '없음'
const getTeacher = (code?: number) =>
return day.slice(1).map((grade, gIdx) => code ? teachers[Number(code.toString().slice(-teachersLen))] : '없음'
grade.slice(1).map((cls, cIdx) =>
cls.slice(1).map((day, dIdx) =>
day.slice(1).map((period, pIdx) => {
const origin = original[gIdx + 1][cIdx + 1][dIdx + 1][pIdx + 1]
const changed = period !== origin
return mergeMap(now.slice(1), original.slice(1), (gNow, gOrigin) =>
mergeMap(gNow.slice(1), gOrigin.slice(1), (cNow, cOrigin) =>
mergeMap(cNow.slice(1), cOrigin.slice(1), (dNow, dOrigin) =>
mergeMap(dNow.slice(1), dOrigin.slice(1), (pNow, pOrigin) => {
const changed = pNow !== pOrigin
return { return {
subject: getSubject(period), subject: getSubject(pNow),
teacher: getTeacher(period), teacher: getTeacher(pNow),
changed, changed,
...(changed ...(changed
? { ? {
originalSubject: origin ? getSubject(origin) : '없음', originalSubject: getSubject(pOrigin),
originalTeacher: origin ? getTeacher(origin) : '없음', originalTeacher: getTeacher(pOrigin),
} }
: {}), : {}),
} as Timetable } as Timetable

11
src/utils/array.ts Normal file
View file

@ -0,0 +1,11 @@
export const mergeMap = <T, F>(
a: T[],
b: T[],
callbackFn: (a: T, b: T) => F,
): F[] => {
const result = []
for (let i = 0; i < Math.max(a.length, b.length); i++)
result.push(callbackFn(a[i], b[i]))
return result
}