我有两个数组,在我测试任何东西之前我不知道数组的值我的意思是数组的长度是动态的
我的问题是如何检查两个数组有一个共同的值
假设我有两个这样的数组 案例1:
array1 = ["this", "is", "array"]
array2 = ["this"]
当我们通过像campareArray(array1,array2)这样的函数比较这些数组时应返回true, 和这样的相同数组:
array1 = ["this"]
array2 = ["this", "is", "array"]
应该返回true
什么是有效的方式?我们可以检查数组长度并检查indexof从大到小还有其他好方法吗?
答案 0 :(得分:2)
使用some()
方法检查数组中的任何元素是否通过测试(作为函数提供)
var array1 = ["this", "is", "array"];
var array2 = ["this"];
var haveOne = array1.some(function (n) {
return array2.indexOf(n) >= 0;
});
console.log(haveOne);
答案 1 :(得分:1)
您可以使用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)
答案 2 :(得分:0)
在第一种方法中,一个简单的循环很好:
版本1
function intersect(arr1, arr2) {
for(var i =0; i < arr1.length; ++i)
if(arr2.indexOf(arr1[i]) >= 0))
return true;
}
<强>版本2 强>
但是如果arr2
远大于arr1
,那么考虑反转循环顺序(通过运行时检查)是值得的:
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;
}
答案 3 :(得分:0)
找到这些阵列之间的交点。见下面的例子
simpleview.Unloaded += (_, __) => simpleview.DataContext = null;