我需要检查数组2是否包含数组1中的所有值。我不知道有任何方法可以做到这一点,所以我开发了一个有效的方法,我想。有没有更好的方法来做到这一点,这是一个很好的解决方案吗?
var contains = function(a1, a2){
var cCount = 0;
for (var i=0; i<a1.length; i++){
for (var j=0; j<a2.length; j++){
if (a1[i] == a2[j]){
cCount++;
}}}
if (cCount == a1.length){
return true;
}
};
答案 0 :(得分:1)
您可以在开始前检查尺码。当一个不存在而不是使用计数器时返回false。如果到达终点则返回true。并且每次都使用indexof循环遍历a2。
var contains = function(a1, a2){
if (a1.length>a2.length) return false;
for (var i=0; i<a1.length; i++){
if (a2.indexOf(a1[i])<0) return false;
}
return true;
}
答案 1 :(得分:0)
只是简单的代码:
function contains(array1, array2){
var found = false;
for (i in array1) {
for (j in array2) {
if (array1[i] == array2[j]) {
found = true;
}
}
if (!found) return false;
}
return true;
}
另一种解决方案我不是很喜欢它,但它更短......
function contains (arr1, arr2) {
var specialChar = "|"; // Use any char or a sequence that won't exist in values.
var str = specialChar + arr2.join(specialChar) + specialChar;
for (i in arr1) if (str.indexOf(specialChar + arr1[i] + specialChar) == -1) return false;
return true;
}
答案 2 :(得分:0)
你的解是O(n * n),即n阶平方。
您可以先对数组进行排序,然后依次检查已排序数组中的元素是否匹配。这将为您提供O(n log n)解决方案。您还可以通过确保array2的大小&lt; = array1的大小来短路检查。
显然,只有你的数组足够大才有意义。
答案 3 :(得分:0)
如果您有第3个对象用于跟踪已经看过的项目,则可以在O(n)中执行此操作。这假设seen
中的查找是O(1)(可能是 - What's the big O for JavaScript's array when used as a hash?)
var seen = {};
arr2.forEach(function(el) {
seen[el] = true;
});
var allContained = true;
arr1.forEach(function(el) {
if ( allContained && !seen[el] ) {
allContained = false;
}
});
return allContained;
答案 4 :(得分:0)
我个人使用Array.every()
方法(当然,这取决于实现此方法的浏览器)与Array.indexOf()
一起使用,这会产生类似于以下内容的东西:
var contains = function(needle, haystack){
return needle.every(function(a){
return haystack.indexOf(a) > -1;
});
};
将其与您已经制作的方法相结合(测试浏览器支持):
var contains = function(needle, haystack){
if ([].every){
return needle.every(function(a){
return haystack.indexOf(a) > -1;
});
}
else {
var result = true;
for (var i = 0, len = needle.length; i < len; i++){
if (haystack.indexOf(needle[i]) === -1) {
return false;
}
}
return result;
}
}
var a1 = [1,2,3],
a2 = [1,2,3,4];
console.log(contains(a1, a2));
请注意,else
代码未经过优化,只是为了演示代码。话虽如此,在MDN页面(在下面的参考文献中)中有Array.every()
的垫片可能会使事情变得更容易。
参考文献: