javascript - 检查一个数组中的每个元素是否都在第二个数组中

标签 javascript arrays node.js

我有两个数组,我想检查 arr2 中的每个元素是否都在 arr1 中。如果元素的值在 arr2 中重复,则它需要在 arr1 中重复相同的次数。这样做的最佳方法是什么?

arr1 = [1, 2, 3, 4]
arr2 = [1, 2]

checkSuperbag(arr1, arr2)
> true //both 1 and 2 are in arr1

arr1 = [1, 2, 3, 4]
arr2 = [1, 2, 5]

checkSuperbag(arr1, arr2)
> false //5 is not in arr1

arr1 = [1, 2, 3]
arr2 = [1, 2, 3, 3]

checkSuperbag(arr1, arr2)
> false //3 is not in arr1 twice

最佳答案

你必须支持糟糕的浏览器吗?如果没有,every功能应该使这很容易。

如果 arr1 是 arr2 的超集,则 arr2 中的每个成员都必须存在于 arr1 中

var isSuperset = arr2.every(function(val) { return arr1.indexOf(val) >= 0; });

这是 fiddle

编辑

所以您要定义超集,以便对于 arr2 中的每个元素,它在 arr1 中出现的次数相同?我认为 filter将帮助您做到这一点(从前面的 MDN 链接中获取 shim 以支持旧版浏览器):

var isSuperset = arr2.every(function (val) { 
    var numIn1 = arr1.filter(function(el) { return el === val;  }).length;
    var numIn2 = arr2.filter(function(el) { return el === val;  }).length;
    return numIn1 === numIn2;   
});

Updated Fiddle

结束编辑


如果您确实想支持旧版浏览器,上面的 MDN 链接有一个您可以添加的 shim,为了您的方便,我在这里复制它:

if (!Array.prototype.every)  
{  
  Array.prototype.every = function(fun /*, thisp */)  
  {  
    "use strict";  

    if (this == null)  
      throw new TypeError();  

    var t = Object(this);  
    var len = t.length >>> 0;  
    if (typeof fun != "function")  
      throw new TypeError();  

    var thisp = arguments[1];  
    for (var i = 0; i < len; i++)  
    {  
      if (i in t && !fun.call(thisp, t[i], i, t))  
        return false;  
    }  

    return true;  
  };  
}  

编辑

请注意,这将是一个 O(N2) 算法,因此请避免在大型数组上运行它。

关于javascript - 检查一个数组中的每个元素是否都在第二个数组中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8628059/

相关文章:

javascript - 使用 javascript 和 json.stringify 函数追加 json 数据

javascript - 有没有办法在添加时仅使用带有数字索引的javascript添加DOM元素?

javascript - 如何顺序/同步进行 API 调用 - EMFILE 错误

node.js - 如何为我的 bluemix 应用程序强制实现 SSL?

javascript - 我从我网站上的评论表单中收到空电子邮件

python - numpy.savetxt() 输出非常大的文件

c++ - 生成唯一的多个随机数

javascript - JS 使用分隔符从一列数组创建两列数组

node.js - Sequelize连接和关系

javascript - 禁止删除多选选项中的最后一个值 - select2