ArrayUtil.ts 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. export class ArrayUtil {
  2. public static has(array: unknown[], v: unknown): boolean {
  3. if (!array) return false
  4. if (array.length <= 0) return false
  5. return array.indexOf(v) != -1
  6. }
  7. public static shuffle(array: unknown[]): void {
  8. if (!array || array.length <= 1) return;
  9. for (let i = array.length - 1; i > 0; i--) {
  10. const j = Math.floor(Math.random() * (i + 1));
  11. [array[i], array[j]] = [array[j], array[i]];
  12. }
  13. }
  14. public static remove(array: unknown[], v: unknown): boolean {
  15. if (!array) return false
  16. if (array.length <= 0) return false
  17. const idx: number = array.indexOf(v)
  18. if (idx === -1) return false
  19. array.splice(idx, 1)
  20. }
  21. public static removeMultiIdx(arr: any[], indices: number[]) {
  22. if (!indices) return arr
  23. if (indices.length <= 0) return arr
  24. const result: any[] = [];
  25. const removedIndices: Set<number> = new Set(indices);
  26. for (let i = 0; i < arr.length; i++) {
  27. if (!removedIndices.has(i)) {
  28. result.push(arr[i]);
  29. }
  30. }
  31. return result;
  32. }
  33. public static pickItem<T>(array: T[]): T {
  34. if (!array) return null
  35. if (array.length <= 0) return null
  36. let idx: number = Math.floor(Math.random() * array.length)
  37. return array[idx]
  38. }
  39. public static pickIndex(array: any[]): number {
  40. if (!array) return null
  41. if (array.length <= 0) return null
  42. let idx: number = Math.floor(Math.random() * array.length)
  43. return idx
  44. }
  45. public static pickItems<T>(array: T[], cnt: number, diff: boolean = false): T[] {
  46. if (!array) return null
  47. if (array.length <= 0) return null
  48. let res: T[] = []
  49. if (!diff) {
  50. for (let i = 0; i < cnt; i++) {
  51. let item: T = this.pickItem(array)
  52. res.push(item)
  53. }
  54. return res
  55. } else {
  56. let arr: T[] = [...array]
  57. for (let i = 0; i < cnt; i++) {
  58. let idx: number = this.pickIndex(arr)
  59. let item: T = arr[idx]
  60. res.push(item)
  61. arr.splice(idx, 1)
  62. if (arr.length <= 0) break
  63. }
  64. return res
  65. }
  66. }
  67. public static pickIndexs(array: any[], cnt: number, diff: boolean = false): number[] {
  68. if (!array) return null
  69. if (array.length <= 0) return null
  70. let res: number[] = []
  71. if (!diff) {
  72. for (let i = 0; i < cnt; i++) {
  73. let idx: number = this.pickIndex(array)
  74. res.push(idx)
  75. }
  76. return res
  77. } else {
  78. let arr: any[] = [...array]
  79. for (let i = 0; i < cnt; i++) {
  80. let idx: number = this.pickIndex(arr)
  81. res.push(idx)
  82. arr.splice(idx, 1)
  83. if (arr.length <= 0) break
  84. }
  85. return res
  86. }
  87. }
  88. public static removeSame(arr: any[], minCnt: number, compareFunc?: Function) {
  89. if (!compareFunc) {
  90. compareFunc = (a, b) => {
  91. return a === b
  92. }
  93. }
  94. const removeIdxArr: number[][] = []
  95. const indices: number[] = []
  96. let sameCnt: number = 1
  97. for (let i = 1; i < arr.length; i++) {
  98. const isSame: boolean = compareFunc(arr[i], arr[i - 1])
  99. if (isSame) {
  100. sameCnt++
  101. if (sameCnt >= minCnt) {
  102. const idxArr: number[] = []
  103. removeIdxArr.push(idxArr)
  104. for (let j = 0; j < minCnt; j++) {
  105. const idx: number = i + j - sameCnt + 1
  106. idxArr.push(idx)
  107. indices.push(idx)
  108. }
  109. }
  110. } else {
  111. sameCnt = 1
  112. }
  113. }
  114. arr = this.removeMultiIdx(arr, indices)
  115. return { removeIdxArr, arr }
  116. }
  117. public static isAllSame<T>(arr: T[], property?: string): boolean {
  118. if (property) return arr.every((val) => val[property] === arr[0][property])
  119. else return arr.every((val) => val === arr[0])
  120. }
  121. }
  122. globalThis.ArrayUtil = ArrayUtil