js多个数组取交集(三个及以上)

JavaScript018

js多个数组取交集(三个及以上),第1张

// 原数组

    const serveralArr = [

        [1,2,4,5,23,3,2,2,4,3,5,5],

        [3,2,3,2,2,4,3,1,4,5,6],

        [3,2,4,3,2,4,1,2,5],

        [3,2,4,5,5,4,3,1,2,2],

        [3,2,23,3,4,1,3,4,5,5,4,3,1,2,2],

        [3,2,4,1,2,5,5,4,3,1,2,2],

        [3,2,4,25,5,4,3,1,2,2],

    ]

    // ES5 方法实现数学意义上的交集结果

    const intersectNoRepeatFirst = serveralArr =>{

        let minArr = serveralArr[0]

        serveralArr.forEach(item =>{

            if(item.length <minArr.length){

                minArr = item

            }

        })

        const result = []

        minArr.forEach(item =>{

            serveralArr.forEach(j =>{

                if(j.includes(item) &&!result.includes(item)){

                    result.push(item)

                }

            })

        })

        return result

    }

    // ES6 方法实现数学意义上的交集结果

    const intersectNoRepeatTwice = arrs =>{

        return arrs.reduce(function(prev,cur){

            // return [...new Set(cur.filter((item)=>prev.includes(item)))]

            return Array.from(new Set(cur.filter((item)=>prev.includes(item))))

        })

    }

    // 输出数学意义上的交集结果

    console.log(intersectNoRepeatFirst(serveralArr), intersectNoRepeatTwice(serveralArr)) // =>(5) [3, 2, 4, 1, 5](5) [3, 2, 4, 5, 1]

    // ES5 方法实现有重复元素的交集结果

    const intersectRepeat = arr =>{

        const result = []

        const tempArr = []

        arr.forEach(item =>{

            const obj = {}

            item.forEach(j =>{

                if(obj.hasOwnProperty(j)){

                    obj[j] += 1

                }else{

                    obj[j] = 1

                }

            })

            tempArr.push(obj)

        })

        let arrr = tempArr[0]

        tempArr.forEach(item =>{

            if(item.length <arrr.length){

                arrr = item

            }

        })

        const newOjb = {}

        Object.keys(arrr).forEach(item =>{

            newOjb[item] = Math.min.apply(Math, tempArr.map(function(o) {return o[item]}))

        })

        Object.keys(newOjb).forEach(item =>{

            if(newOjb[item]){

                for(let i = 0i <newOjb[item]i++){

                    result.push(Number(item))

                }

            }

        })

        return result

    }

    // 输出有重复元素的交集结果

    console.log(intersectRepeat(serveralArr)) // =>(9) [1, 2, 2, 2, 3, 3, 4, 4, 5]

(10,20)(20,30)如果只是判断有交叉的到也简单

(10,20)-的大小 20-10=10

(20,30)大小30-20=10

(10,20)(20,30)大小30-10=20

现在10+10=20,ok,他们没有交叉

验证:

(10,20)(19,30)

| |

10 11

(10+11)>(30-10)

ok他们有交叉

其实,我的想法很简单,既然是区间了,他就有个界限,你可以用他的界限来看看他是处在哪个区间,或者说是那几个区间之间。

判断(x,y)有没有跟其他的区间交叉,

如果x<10,说明他肯定没有跟(10,20)交叉,也不会跟区间左界限>10的区间交叉,

如果x>10说明他有可能跟(10,20)交叉,当然还要看y的大小了,

总之,就是比较x,y 跟几个区间界限的大小,这样就能判定他跟几个区间的交叉。

在这里,还是要好好的考虑一下怎样比较下来,比较的节省时间。