模拟ES6的Set类实现一些数学运算

ES6新增了Set类作为js的API的一部分,我们可以基于ES6的Set类开发我们自己的Set类.

先来看下原生的Set类怎么用.

        const set =new Set()
        set.add(1)
        console.log(set.values());
        console.log(set.has(1));//true
        console.log(set.size);//1
        set.delete(1)
        console.log(set.size)//

看下控制台输出结果:

模拟ES6的Set类实现一些数学运算_第1张图片

接下来看下ES6的Set类的运算:

其实ES6原生的Set并没有实现并集,交集,差集及子集等数学运算,不过我们可以模拟.

我们的例子会用到下面两个集合:

    //创建两个集合
        const setA = new Set()
        setA.add(1)
        setA.add(2)
        setA.add(3)

        const setB = new Set()
        setB.add(2)
        setB.add(3)
        setB.add(4)
  1. 模拟并集运算

我们可以创建一个函数,来返回包含setA和setB中所有的元素的新集合.迭代这两个集合,把所有元素都添加到并集的集合中.代码如下:

  //创建两个集合
        const setA = new Set()
        setA.add(1)
        setA.add(2)
        setA.add(3)

        const setB = new Set()
        setB.add(2)
        setB.add(3)
        setB.add(4)

        //模拟并集运算
        const union = (setA, setB) => {
            const unionAb = new Set()
            setA.forEach(value => unionAb.add(value));
            setB.forEach(value => unionAb.add(value));
            return unionAb;
        }
        console.log(union(setA, setB));

看下控制台输出结果:

  1. 模拟交集运算

模拟交集运算,需要创建一个辅助函数,来生成包含setA和setB共有元素的新集合.代码如下:

    //模拟交集运算
        const intersection = (setA, setB) => {
            const intersectionSet = new Set()
            setA.forEach(value => {
                if(setB.has(value)){
                    intersectionSet.add(value)
                }
            });
            
            return intersectionSet;
        }
        console.log(intersection(setA, setB));

看下控制台输出结果:

模拟ES6的Set类实现一些数学运算_第2张图片
  1. 模拟差集运算

交集运算创建的集合包含setA和setB都有的元素,差集运算创建的集合则包含setA有而setB没有的元素.如下代码所示:

 //模拟差集运算
        const difference = (setA, setB) => {
            const differenceSet = new Set()
            setA.forEach(value => {
                if(!setB.has(value)){
                    differenceSet.add(value)
                }
            });
            
            return differenceSet;
        }
        console.log(difference(setA, setB));

看下控制台输出结果:

模拟ES6的Set类实现一些数学运算_第3张图片
  1. 使用扩展运算符

(1)进行并集运算

    //创建两个集合
        const setA = new Set()
        setA.add(1)
        setA.add(2)
        setA.add(3)

        const setB = new Set()
        setB.add(2)
        setB.add(3)
        setB.add(4)

        //使用扩展运算符进行并集的运算
        console.log(new Set([...setA, ...setB]));

效果是一样的:

模拟ES6的Set类实现一些数学运算_第4张图片

(2)进行交集的运算

//使用扩展运算符进行交集的运算
console.log(new Set([...setA].filter(x=>setB.has(x))))

(3)进行差集的运算

   //使用扩展运算符进行差集的运算
   console.log(new Set([...setA].filter(x=>!setB.has(x))))

你可能感兴趣的:(前端,js,前端)