js一个数组元素被另一个数组完全包含

184 阅读1分钟

数组arr2的元素完全被数组arr1完全包含

自己总结了下面几种方法,同时也用了 performance.now() 去检测性能

总体来说,数据量大时,用Set和Map执行时间最短

执行时间最短的按下面的方式来说,Set方式执行时间最短

没有做复杂类型的判断,有需要的可以自己在下面的函数进行拓展

// 生成随机字符串
function randomString(e) {
    e = e || 32;
    var t = "ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678",
    a = t.length,
    n = "";
    for (i = 0; i < e; i++) n += t.charAt(Math.floor(Math.random() * a));
    return n
}
// every + includes
function arrIncludes(arr1, arr2) {
    if (!Array.isArray(arr2)) {
        arr2 = [arr2];
    }
    return arr2.every(val => arr1.includes(val));
}
// indexOf
function arrIncludes2(arr1, arr2) {
    if (!Array.isArray(arr2)) {
        arr2 = [arr2];
    }
    const aaStr = arr1.toString();
    for (let i = 0; i < arr2.length; i += 1) {
        if (aaStr.indexOf(arr2[i]) < 0) return false;
    }
    return true;
}
// Set
function arrIncludes3(arr1, arr2) {
    if (!Array.isArray(arr2)) {
        arr2 = [arr2];
    }
    const tempArrLength = Array.from(new Set([...arr1, ...arr2])).length;
    return tempArrLength === arr1.length || tempArrLength === arr2.length;
}
// Map
function arrIncludes4(arr1, arr2) {
    if (!Array.isArray(arr2)) {
        arr2 = [arr2];
    }
    const map1 = new Map()
    console.log('map1: ', map1);
    arr1.forEach(item => map1.set(item,item))
    console.log('map2: ', map1);
    return arr2.every(val => map1.has(val));
}
let arr1 = []
// 生成随机字符串
for (let i = 1; i <= 100000; i++) {
    arr1.push(randomString(10));
}
console.log('arr1: ', arr1);
let arr2 = arr1.slice(0, 50000)
console.log('arr2: ', arr2);
// let arr1 = ['1','3','4','5','6','2']
// let arr2 = ['1','2','6','7']

let timeA1 = performance.now()
let resA = arrIncludes(arr1, arr2)
console.log('resA: ', resA);
let timeA2= performance.now()
let timeResA1 = timeA2-timeA1
console.log('timeResA1: ', timeResA1);


let timeB1 = performance.now()
let resB = arrIncludes2(arr1, arr2)
console.log('resB: ', resB);
let timeB2= performance.now()
let timeResB1 = timeB2-timeB1
console.log('timeResB1: ', timeResB1);

let timeC1 = performance.now()
let resC = arrIncludes3(arr1, arr2)
console.log('resC: ', resC);
let timeC2= performance.now()
let timeResC1 = timeC2-timeC1
console.log('timeResC1: ', timeResC1);

let timeD1 = performance.now()
let resD = arrIncludes4(arr1, arr2)
console.log('resD: ', resD);
let timeD2= performance.now()
let timeResD1 = timeD2-timeD1
console.log('timeResD1: ', timeResD1);