我有两个数组,我想检查 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;
});
结束编辑
如果您确实想支持旧版浏览器,上面的 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/