我有一个目标数组[“apple”、“banana”、“orange”],我想检查其他数组是否包含任何一个目标阵列元素。

例如:

["apple","grape"] //returns true;

["apple","banana","pineapple"] //returns true;

["grape", "pineapple"] //returns false;

如何在JavaScript中实现?


当前回答

添加到阵列原型

免责声明:许多人强烈建议不要这样做。唯一真正有问题的是,如果一个库添加了一个同名(行为不同)的原型函数或类似的东西。

代码:

Array.prototype.containsAny = function(arr) {
    return this.some(
        (v) => (arr.indexOf(v) >= 0)
    )
}

不使用大箭头功能:

Array.prototype.containsAny = function(arr) {
    return this.some(function (v) {
        return arr.indexOf(v) >= 0
    })
}

用法

var a = ["a","b"]

console.log(a.containsAny(["b","z"]))    // Outputs true

console.log(a.containsAny(["z"]))    // Outputs false

其他回答

更新@Paul Grimshaw答案,使用includes代替indexOf以提高可读性

let found=arr1.some(r=>arr2.indexOf(r)>=0)let found=arr1.some(r=>arr2.includes(r))

使用筛选器/indexOf:

函数containsAny(源,目标){var result=source.filter(函数(项){return target.indexOf(项)>-1});返回(result.length>0);} //结果var fruits=[“苹果”、“香蕉”、“橙色”];console.log(包含任何(水果,[“苹果”,“葡萄”]);console.log(包含任何(水果,[“苹果”,“香蕉”,“菠萝”]);console.log(包含任何(水果,[“葡萄”,“菠萝”]);

您可以使用lodash并执行以下操作:

_.intersection(originalTarget, arrayToCheck).length > 0

在两个集合上进行集合交集,生成一个相同元素的数组。

我写了3个解决方案。本质上,他们也是这样做的。他们一变为真就变为真。我写了三个解决方案,只是为了展示三种不同的做事方式。现在,这取决于你更喜欢什么。您可以使用performance.now()检查一个或另一个解决方案的性能。在我的解决方案中,我还检查了哪个阵列最大,哪个阵列最小,以提高操作效率。

第三种解决方案可能不是最可爱的,但很有效。我决定添加它,因为在一些编码面试中,您不允许使用内置方法。

最后,当然。。。我们可以用2个NESTED for循环(蛮力方法)提出解决方案,但您希望避免这种情况,因为时间复杂度是坏的O(n^2)。

注:

您可以使用.indexOf()。如果您检查该值是否大于0。如果值不存在会给你-1。如果它确实存在,它会给你大于0。

indexOf()与includes()

哪个性能更好?indexOf()稍有不同,但我认为includes更可读。

如果我没弄错的话,.includes()和indexOf()在幕后使用循环,所以当它们与.some()一起使用时,您将处于O(n^2)。

USING循环

 const compareArraysWithIncludes = (arr1, arr2) => {
     const [smallArray, bigArray] =
        arr1.length < arr2.length ? [arr1, arr2] : [arr2, arr1];

     for (let i = 0; i < smallArray.length; i++) {
       return bigArray.includes(smallArray[i]);
     }

      return false;
    };

使用.some()

const compareArraysWithSome = (arr1, arr2) => {
  const [smallArray, bigArray] =
    arr1.length < arr2.length ? [arr1, arr2] : [arr2, arr1];
  return smallArray.some(c => bigArray.includes(c));
};

使用MAPS时间复杂度O(2n)=>O(n)

const compararArraysUsingObjs = (arr1, arr2) => {
  const map = {};

  const [smallArray, bigArray] =
    arr1.length < arr2.length ? [arr1, arr2] : [arr2, arr1];

  for (let i = 0; i < smallArray.length; i++) {
    if (!map[smallArray[i]]) {
      map[smallArray[i]] = true;
    }
  }

  for (let i = 0; i < bigArray.length; i++) {
    if (map[bigArray[i]]) {
      return true;
    }
  }

  return false;
};

我的代码:堆垛机

我既不是表演专家,也不是BigO,所以如果我说的有错,请告诉我。

可以使用嵌套的Array.prototype.some调用。这有一个好处,即它将在第一场比赛中获胜,而不是其他将在整个嵌套循环中运行的解决方案。

eg.

var arr = [1, 2, 3];
var match = [2, 4];

var hasMatch = arr.some(a => match.some(m => a === m));