Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/391.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用for循环检查两个数组中的匹配值,遍历较小的循环是否更快?_Javascript_Arrays_Performance_For Loop - Fatal编程技术网

Javascript 使用for循环检查两个数组中的匹配值,遍历较小的循环是否更快?

Javascript 使用for循环检查两个数组中的匹配值,遍历较小的循环是否更快?,javascript,arrays,performance,for-loop,Javascript,Arrays,Performance,For Loop,我正在创建一个函数,该函数将接受两个参数,每个参数都是数组,并返回两个数组之间匹配值的单独数组。 我做了两个版本的函数 默认情况下,对 循环,并使用.includes() 例: 我的问题是,这是否真的提高了性能,或者没有影响,或者损害了性能(通过添加更多的变量定义、计算等)?这不会产生重大影响,因为最坏情况下的复杂性是O(n*m),其中n和m是数组的长度 您可以对2个数组进行排序并使用2个指针找到交集,这种情况下的时间复杂度为O(nlogn+mlogm+n+m)取决于使用的排序算法我想我会选择第

我正在创建一个函数,该函数将接受两个参数,每个参数都是数组,并返回两个数组之间匹配值的单独数组。
我做了两个版本的函数

  • 默认情况下,对 循环,并使用
    .includes()
  • 例:


    我的问题是,这是否真的提高了性能,或者没有影响,或者损害了性能(通过添加更多的变量定义、计算等)?

    这不会产生重大影响,因为最坏情况下的复杂性是O(n*m),其中n和m是数组的长度


    您可以对2个数组进行排序并使用2个指针找到交集,这种情况下的时间复杂度为O(nlogn+mlogm+n+m)取决于使用的排序算法我想我会选择第一种方法,因为.includes函数将尝试迭代数组,并在找到元素时返回true,因此,如果元素位于数组的末尾,它将在数组上完全迭代。因此,您选择小数组的尝试不会产生太大的差异。

    下面是一个使用集合查看一个数组是否包含来自另一个数组的值的示例

    如果不是ES6(为什么不是?),可以使用简单的对象文字

    这应该比双for循环快,因为includes就是这么做的

    函数makeRandom(计数,最大值){
    返回数组。从(新数组(计数),
    (a,ix)=>Math.round(Math.random()*max));
    }
    功能联合体(a、b){
    var aSet=新集合(a),oSet=新集合();
    b、 forEach((v)=>{if(aSet.has(v))oSet.add(v)});
    返回数组.from(oSet);
    }
    常数
    random1=makeRandom(5,10),
    随机数2=随机数(5,10);
    常数
    unionArray=union(随机数1,随机数2);
    console.log(random1.join(“:”);
    console.log(random2.join(“:”);
    
    console.log(unionArray.join(“:”)加快速度的一种方法是将其中一个数组生成关联的数组或集合,因为这些数组使用称为哈希映射的东西。然后通过另一个循环来检查join。
    var matches = [];
    for (let i = 0, len = array1.length; i < len; i++) {
        var a = array1[i];
        if (array2.includes(a)) {
            matches.push(a)
        }
    
    if (array1.length <= array2.length) {
        var itArr = array1;
        var checkArr = array2 }
    else { var itArr = array2
           var checkArr = array1 };
    var matches = [];
    for (let i = 0, len = itArr.length; i < len; i++) {
        var a = itArr[i];
        if (checkArr.includes(a)) {
            matches.push(a)
        }