Data.ts 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. import { assetManager, JsonAsset } from "cc"
  2. import { isNumber } from "db://assets/script/Manager/Utils"
  3. import { IData } from "./interfaceMgr"
  4. export type OptionObjectKey<E> = {
  5. [P in keyof E]?: E[P]
  6. }
  7. export class Data<T extends IData> {
  8. protected _data: T[] = null
  9. protected className = ''
  10. get data() {
  11. return this._data
  12. }
  13. processItem(data: T): T {
  14. return data
  15. }
  16. clone(v: T) {
  17. if (!v) return undefined
  18. return {
  19. ...v
  20. }
  21. }
  22. split(v: any) {
  23. return `${v}`.split('|').map(v => Number(v))
  24. }
  25. split2(v: any) {
  26. return `${v}`.split('|').map(v => (v))
  27. }
  28. async loadData() {
  29. if (this._data != null) return true
  30. return new Promise<boolean>((resolve, reject) => {
  31. assetManager.getBundle('hall').load(`data/${this.className}`, (error, data: JsonAsset) => {
  32. if (!error) {
  33. this._data = (data.json as T[]).filter(v => isNumber(v.id)).map(v => this.processItem(v))
  34. console.log(`load ${this.className} data success`)
  35. resolve(true)
  36. } else {
  37. reject(error)
  38. }
  39. })
  40. })
  41. }
  42. private predicate(q: OptionObjectKey<T>, v: T) {
  43. const keys = Object.keys(q)
  44. for (let index = 0; index < keys.length; index++) {
  45. if (q[keys[index]] != v[keys[index]]) return false
  46. }
  47. return true
  48. }
  49. findOne(q: OptionObjectKey<T>) {
  50. return this.data.find(v => this.predicate(q, v))
  51. }
  52. find(q: OptionObjectKey<T>) {
  53. return this.data.filter(v => this.predicate(q, v))
  54. }
  55. findById(id: number) {
  56. return this.data.find(v => v.id == id)
  57. }
  58. findByDifferentId(id: number) {
  59. return this.data.filter(v => v.id != id)
  60. }
  61. }