繁体   English   中英

检查 2 arrays 是否在 javascript 中包含相同值的最快方法

[英]Quickest way to check if 2 arrays contain same values in javascript

是否有更快或更有效的方法来检查两个 arrays 在 javascript 中是否包含相同的值?

这是我目前正在做的检查。 它有效,但很长。

    var arraysAreDifferent = false;
    for (var i = 0; i < array1.length; i++) {
      if (!array2.includes(array1[i])) {
        arraysAreDifferent = true;
      }
    }
    for (var i = 0; i < array2.length; i++) {
      if (!array1.includes(array2[i])) {
        arraysAreDifferent = true;
      }
    }

要将计算复杂度从O(n ^ 2)降低到O(n) ,请改用 Sets - Set.hasO(1) ,但Array.includesO(n)

使用.every来检查数组中的每个项目是否都通过了测试,而不是常规for循环的冗长手动迭代。 还要检查两个 Set 的大小是否相同 - 如果这样做了,那么如果 arrays 之一被迭代,则不需要迭代另一个(除了构建其 Set):

const arr1Set = new Set(array1);
const arr2Set = new Set(array2);
const arraysAreDifferent = (
  arr1Set.size === arr2Set.size &&
  array1.every(item => arr2Set.has(item))

);

function same(arr1, arr2){
    //----if you want to check by length as well 
    // if(arr1.length != arr2.length){
    //     return false;
    // }

    // creating an object with key => arr1 value and value => number of time that value repeat;
    let frequencyCounter1 = {};
    let frequencyCounter2 = {};
    for(let val of arr1){
        frequencyCounter1[val] = (frequencyCounter1[val] || 0) + 1;
    }
    for(let val of arr2){
        frequencyCounter2[val] = (frequencyCounter2[val] || 0) + 1;
    }
    for(let key in frequencyCounter1){
        //check if the key is present in arr2 or not 
        if(!(key in frequencyCounter2)) return false;
        //check the number of times the value repetiton is same or not;
        if(frequencyCounter2[key]!==frequencyCounter1[key]) return false;
    }
    return true;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM