import { assetManager, JsonAsset } from "cc" import { isNumber } from "db://assets/script/Manager/Utils" import { IData } from "./interfaceMgr" export type OptionObjectKey = { [P in keyof E]?: E[P] } export class Data { protected _data: T[] = null protected className = '' get data() { return this._data } processItem(data: T): T { return data } clone(v: T) { if (!v) return undefined return { ...v } } split(v: any) { return `${v}`.split('|').map(v => Number(v)) } split2(v: any) { return `${v}`.split('|').map(v => (v)) } async loadData() { if (this._data != null) return true return new Promise((resolve, reject) => { assetManager.getBundle('hall').load(`data/${this.className}`, (error, data: JsonAsset) => { if (!error) { this._data = (data.json as T[]).filter(v => isNumber(v.id)).map(v => this.processItem(v)) console.log(`load ${this.className} data success`) resolve(true) } else { reject(error) } }) }) } private predicate(q: OptionObjectKey, v: T) { const keys = Object.keys(q) for (let index = 0; index < keys.length; index++) { if (q[keys[index]] != v[keys[index]]) return false } return true } findOne(q: OptionObjectKey) { return this.data.find(v => this.predicate(q, v)) } find(q: OptionObjectKey) { return this.data.filter(v => this.predicate(q, v)) } findById(id: number) { return this.data.find(v => v.id == id) } findByDifferentId(id: number) { return this.data.filter(v => v.id != id) } }