美文网首页
TypeScript扩展函数(数组)

TypeScript扩展函数(数组)

作者: fanyu__ | 来源:发表于2021-03-12 16:06 被阅读0次
  1. 函数的实现
/**
 * 数组操作函数
 */
export class ArrayHelper {

    /**
     * 对一个数组的元素进行去重
     * @param arr 要去重的数组
     * @param comparer 判断元素相等的方法,若为空,则使用默认的判断方法(===)
     * @returns 若数组为空(null或undefined),则返回空数组,否则返回去重后的数组
     */
    static distinct<T>(arr: T[], comparer?: (v1: T, v2: T) => boolean): T[]{
        // 数组为空
        if(!arr){
            return []
        }

        // 用于存放不重复数据的新数组
        const arrNew: T[] = []

        arr.forEach(item=>{
            // 判断数组中是否已包含相同的元素
            const value = arrNew.some(item2=>{
                if(comparer){
                    return comparer(item, item2)
                }else{
                    return item === item2
                }
            })

            // 如果不包含,则添加进去
            if(!value){
                arrNew.push(item)
            }
        })

        return arrNew
    }

    /**
     * 计算两个数组的并集
     * 例:[1, 2, 3, 4] 和 [2, 3, 5, 6] 的并集是 [1, 2, 3, 4, 5, 6]
     * 即先合并,后去重
     * @param arr1 数组1
     * @param arr2 数组2
     * @param comparer 判断元素相等的方法,若为空,则使用默认的判断方法(===)
     * @returns 若数组1和数组2都为空(null或undefined),则返回空数组,若只数组1为空(同上),则返回去重后的数组2,若只数组2为空,亦然,否则返回并集
     */
    static union<T>(arr1: T[], arr2: T[], comparer?: (v1: T, v2: T) => boolean): T[] {
        // 两个都是空
        if(!arr1 && !arr2){
            return []
        }

        // arr1是空
        if (!arr1 && arr2) {
            return ArrayHelper.distinct(arr2)
        }

        // arr2是空
        if(arr1 && !arr2){
            return ArrayHelper.distinct(arr1)
        }

        // 合并两个数组
        arr1.push(...arr2)

        // 元素去重
        const arr = ArrayHelper.distinct(arr1)

        return arr
    }

    /**
     * 计算两个数组的交集
     * 例:[1, 2, 3, 4] 和 [2, 3, 5, 6] 的交集是 [2, 3]
     * 即取两个数组同时存在的数据
     * @param arr1 数组1
     * @param arr2 数组2
     * @param comparer 判断元素相等的方法,若为空,则使用默认的判断方法(===)
     * @returns 若数组1或数组2为空(null或undefined),则返回空数组,否则返回交集
     */
    static intersect<T>(arr1: T[], arr2: T[], comparer?: (v1: T, v2: T) => boolean): T[]{
        // 若有一个为空
        if(!arr1 || !arr2){
            return []
        }

        // 从数组1中筛选出包含在数组2中的元素
        const arr = arr1.filter(item=>{
            return arr2.some(item2=>{
                if(comparer){
                    return comparer(item, item2)
                }else{
                    return item === item2
                }
            })
        })

        return arr
    }

    /**
     * 计算两个数组的差集(包含在数组1中但不包含在数组2中)
     * 例:[1, 2, 3, 4] 和 [2, 3, 5, 6] 的差集是 [1, 4]
     * @param arr1 数组1
     * @param arr2 数组2
     * @param comparer 判断元素相等的方法,若为空,则使用默认的判断方法(===)
     * @returns 若数组1为空,则返回空数组,若数组1不为空但数组2为空,则返回数组1,否则返回差集
     */
    static except<T>(arr1: T[], arr2: T[], comparer?: (v1: T, v2: T) => boolean): T[]{
        // 数组1为空
        if(!arr1){
            return []
        }

        // 数组1不为空但数组2为空
        if(arr1 && !arr2){
            return arr1
        }

        // 合并两个数组
        const arrNew = arr1.concat(arr2)

        // 从数组中筛选出包含在数组1中的但不包含在数组2中的元素
        const arr = arrNew.filter(item=>{
            return arr1.some(item2=>{
                if(comparer){
                    return comparer(item, item2)
                }else{
                    return item === item2
                }
            }) && !arr2.some(item2=>{
                if(comparer){
                    return comparer(item, item2)
                }else{
                    return item === item2
                }
            })
        })

        return arr
    }

    /**
     * 将一个类型数组转换为另一个类型的数组
     * @param source 要转换的数组
     * @param converter 转换方法
     * @returns 若源数组为空,则返回空数组,否则返回转换后的数组
     */
    static convertAll<TInput, TOutput>(source: TInput[], converter: (v: TInput) => TOutput): TOutput[]{
        // 源数组为空
        if(!source){
            return []
        }

        // 定义新数组
        const arr: TOutput[] = []

        // 进行转换
        source.forEach(item=>{
            arr.push(converter(item))
        })

        return arr
    }
}
  1. 函数声明
    a. 在src文件夹下新建文件夹@types
    b. 创建声明文件放到@types文件夹下
declare global {
    interface Array<T> {
        /**
         * 对数组去重
         * @param comparer 判断元素相等的方法,若为空,则使用默认的判断方法(===)
         */
        distinct<T>(comparer?: (v1: T, v2: T) => boolean): T[]

        /**
         * 两个集合的并集
         * @param comparer 判断元素相等的方法,若为空,则使用默认的判断方法(===)
         */
        union(arr: T[], comparer?: (v1: T, v2: T) => boolean): T[]

        /**
         * 两个集合的交集
         * @param arr
         * @param comparer 判断元素相等的方法,若为空,则使用默认的判断方法(===)
         */
        intersect(arr: T[], comparer?: (v1: T, v2: T) => boolean): T[]

        /**
         * 两个集合的差集
         * @param arr
         * @param comparer 判断元素相等的方法,若为空,则使用默认的判断方法(===)
         */
        except(arr: T[], comparer?: (v1: T, v2: T) => boolean): T[]

        /**
         * 集合转换
         * @param converter 转换方法
         */
        convertAll<TOutput>(converter: (v: T) => TOutput): TOutput[]
    }
}
export {}
  1. 在index.ts中进行注册
    Array.prototype.distinct = function<T>(comparer?: (v1: T, v2: T) => boolean)  {
        return ArrayHelper.distinct(this, comparer)
    }

    Array.prototype.union = function<T>(arr: T[], comparer?: (v1: T, v2: T) => boolean)  {
        return ArrayHelper.union(this, arr, comparer)
    }

    Array.prototype.intersect = function<T>(arr: T[], comparer?: (v1: T, v2: T) => boolean) {
        return ArrayHelper.intersect(this, arr, comparer)
    }

    Array.prototype.except = function<T>(arr: T[], comparer?: (v1: T, v2: T) => boolean)  {
        return ArrayHelper.except(this, arr, comparer)
    }

    Array.prototype.convertAll = function<T>(converter: (v: T) => T)  {
        return ArrayHelper.convertAll(this, converter)
    }

相关文章

  • TypeScript扩展函数(数组)

    函数的实现 函数声明a. 在src文件夹下新建文件夹@typesb. 创建声明文件放到@types文件夹下 在in...

  • 3.数组扩展

    1)cat函数扩展结果=cat(1或2,数组1,数组2) 3)水平连接扩展结果=horzcat(数组1,数组2,。...

  • ES6扩展

    字符串的扩展正则的扩展数值的扩展数组的扩展函数的扩展对象的扩展

  • 字符串、数组、函数、对象

    字符串 多行字符串 字符串模板 数组 扩展 函数参数的扩展 类数组对象转数组 函数 默认值 以下两种写法的区别? ...

  • ES6 字符串、数组、函数、对象

    字符串 1. 多行字符串 2. 字符串模板 数组 1. 扩展 2. 函数参数的扩展 3. 类数组对象转数组 函数 ...

  • Numpy数组

    内容参考:Numpy库常用函数大全 数组的属性 栗子: 数组的创建 扩展小知识:单位矩阵 栗子: 数组的随机函数 ...

  • ES6基础-ES6的扩展

    进行对字符串扩展,正则扩展,数值扩展,函数扩展,对象扩展,数组扩展。 开发环境准备: 编辑器(VS Code, A...

  • Vue项目开发与规范--es6语法规范篇

    目录 简介 let const 解构赋值 正则的扩展 字符串的扩展 数值的扩展 数组的扩展 函数的扩展 对象的扩展...

  • ES6扩展

    字符串扩展 正则扩展 数值扩展 函数扩展 对象扩展 数组扩展 字符串扩展 模版字符串 部分新的方法 padStar...

  • TypeScript05(函数扩展)

    函数的类型 函数的可选参数? 函数参数的默认值 接口定义函数 定义剩余参数 函数重载重载是方法名字相同,而参数不同...

网友评论

      本文标题:TypeScript扩展函数(数组)

      本文链接:https://www.haomeiwen.com/subject/puyzqltx.html