【问题标题】:How to check a value present in other array and vise versa如何检查另一个数组中存在的值,反之亦然
【发布时间】:2016-09-11 21:38:42
【问题描述】:

我有两个数组,在我测试任何东西之前我不知道数组的值我的意思是数组的长度是动态的

我的问题是如何检查两个数组至少有一个共同值

假设我有两个这样的数组 案例一:

array1 = ["this", "is", "array"]
array2 = ["this"]

当我们通过像 campareArray(array1, array2) 这样的函数比较这些数组时,应该返回 true, 和这样的相同数组:

array1 = ["this"]
array2 = ["this", "is", "array"]

应该返回真

什么是有效的方法?我们可以检查数组长度和从大到小检查indexof还有什么好的方法吗?

【问题讨论】:

  • Array.prototype.some()

标签: javascript jquery arrays


【解决方案1】:

使用some() 方法,该方法检查数组中的任何元素是否通过测试(作为函数提供)

var array1 = ["this", "is", "array"];
var array2 = ["this"];

var haveOne = array1.some(function (n) {
  return array2.indexOf(n) >= 0;
});

console.log(haveOne);

【讨论】:

  • some() 接受回调,一旦回调返回'true',它将停止迭代,而不是every()。这是它的典型用法。我喜欢这个答案。
【解决方案2】:

你可以使用filter()方法得到两个数组的交集。

var array1 = ["this", "is", "array"],
  array2 = ["this"];

var result = array1.filter(function(n) {
  return array2.indexOf(n) != -1;
});
console.log("Arrays have common element: " + !!result.length)
console.log(result)

【讨论】:

    【解决方案3】:

    只需找到这些数组之间的交集。看下面的例子

     <script>
         var alpha = ["this", "is", "array"],
         beta = ["this"];
    
        $.arrayIntersect = function(a, b)
        {
            return $.grep(a, function(i)
            {
                return $.inArray(i, b) > -1;
            });
        };
    
        console.log( $.arrayIntersect(alpha, beta) );
     </script>
    

    【讨论】:

      【解决方案4】:

      在第一种方法中,一个简单的循环就可以了:

      版本 1

      function intersect(arr1, arr2) {
          for(var i =0; i < arr1.length; ++i)
              if(arr2.indexOf(arr1[i]) >= 0))
                  return true;
      }
      

      版本2 但如果arr2arr1 大得多,则值得考虑反转循环顺序(通过运行时检查):

      function intersect(arr1, arr2) {
        if(arr1.length < arr2.length) {
           return intersect(arr2, arr1);
        }
        for(var i =0; i < arr1.length; ++i)
            if(arr2.indexOf(arr1[i]) >= 0))
                 return true;
         return false;
      }
      

      值得的执行时间是相同的,但由于更好的内存访问而具有更好的平均值(因为小数组将适合缓存,而大数组则不适合)。

      如果小数组是一个 litteral 对象会更好,因为对象上的键查找比数组上的 indexOf 快得多。

      function intersect2(arr1, arr2) {
          if(arr1.length >= threshold || arr2.length <= threshold) { // to be experimented
              return intersect(arr1, arr2);
          }
      
      
          var keys = {};
          for(var i = 0; i < arr1.length; ++i) {
             keys[arr[i]] = true;
          }
      
          for(var i = 0; i < arr2.length; ++i) {
              if(keys[arr2.length]) 
                  return true;
          }
      
          return false;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-02-27
        • 2020-08-28
        • 1970-01-01
        • 1970-01-01
        • 2017-10-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多