/** * 删除数组中指定的元素,返回数组本身 * @param {Array} arr 需要操作的数组 * @param {*} el 需要移除的元素 */ export function arrayRemove(arr: Array, el: T): Array { let j = 0 for (let i = 0, l = arr.length; i < l; i++) { if (arr[i] !== el) { arr[j++] = arr[i] } } arr.length = j return arr } export function arrayRemoveOnce(arr: Array, el: T): Array { let index = arr.indexOf(el) if (index !== -1) arr.splice(index, 1) return arr } /** * 删除通过函数校验的元素 * @param {(e: T) => boolean} checkFuntion 校验函数 */ export function arrayRemoveIf(arr: Array, checkFuntion: (e: T) => boolean): Array { let j = 0 for (let i = 0, l = arr.length; i < l; i++) { if (!checkFuntion(arr[i])) { arr[j++] = arr[i] } } arr.length = j return arr } /** 获取数据第一个元素 */ export function arrayFirst(arr: Array): T { return arr[0] } /** 获取数组最后一个元素 */ export function arrayLast(arr: { [key: number]: T; length: number }): T { return arr[arr.length - 1] } /** * 根据数值从小到大排序数组 * @param {Array} arr * @returns {Array} 返回自身 */ export function arraySortByNumber(arr: Array): Array { arr.sort(sortNumberCompart) return arr } /** * 对排序好的数组进行去重操作 * @param {(e1, e2) => boolean} [checkFuction] 校验对象相等函数 * @returns {Array} 返回自身 */ export function arrayRemoveDuplicateBySort(arr: Array, checkFuction: (e1: T, e2: T) => boolean = checkEqual): Array { if (arr.length < 2) return arr let j = 1 for (let i = 1, l = arr.length; i < l; i++) if (!checkFuction(arr[j - 1], arr[i])) arr[j++] = arr[i] arr.length = j return arr } /** 原地更新数组,注意这个函数并不会比map快 */ export function arrayMap(arr: Array, mapFunc: (v: T) => T): Array { for (let i = 0, count = arr.length; i < count; i++) arr[i] = mapFunc(arr[i]) return arr } /** 排序数比较 */ function sortNumberCompart(e1: any, e2: any) { return e1 - e2 } /** 判断两个数是否相等 */ function checkEqual(e1: any, e2: any): boolean { return e1 === e2 } /** * 改变数组的值顺序 * @param arr 需要改变初始值位置的数组 * @param index //将index位置以后的值放到起始位置 */ export function changeArrayStartIndex(arr: T[], index: number): T[] { arr.unshift(...arr.splice(index)) return arr } /** 判断两个数组是否相等 */ export function equalArray(a: T[], b: T[], checkF = checkEqual) { if (a === b) return true if (a.length !== b.length) return false for (let i = 0; i < a.length; ++i) if (!checkF(a[i], b[i])) return false return true } /** 数组克隆 */ export function arrayClone(arr: T[]): T[] { return arr.slice() } /** 数组2元素合并到数组1末尾 */ // https://jsperf.com/merge-array-implementations/30 export function arrayPushArray(arr1: T[], arr2: T[]): T[] { let arr1Length = arr1.length let arr2Length = arr2.length arr1.length = arr1Length + arr2Length for (let i = 0; i < arr2Length; i++) arr1[arr1Length + i] = arr2[i] return arr1 } /** 数组元素求合 */ export function arraySum(arr: number[]) { let sum = 0 for (let n of arr) sum += n return sum } /** 条件过滤集合 */ export function FilterSet(s: Set, fn: (el: T) => boolean): Set { let ns = new Set() for (let el of s) { if (fn(el)) ns.add(el) } return ns } /** 查找数组中最大的元素 */ export function arrayMax(arr: T[], f: (item: T) => number = a => (a as unknown as number)): [T, number] { let max = Number.NEGATIVE_INFINITY let maxIndex = -1 for (let i = 0; i < arr.length; i++) { let item = arr[i] let v = f(item) if (v > max) { maxIndex = i max = v } } return [arr[maxIndex], maxIndex] }