我知道我可以编写自定义循环,将array1
和每个元素indexOf
写入另一个数组。
但我正在尝试制作游戏。我可以看到自己遇到很多情况,我不得不一遍又一遍地编写相同的代码。因此,我认为使用一些实用程序库是个好主意。现在我的想法是lodash
。但是,我要先学习它。
那么我如何轻松地比较两个数组,如果任何元素匹配另一个元素中的任何元素,则返回true。
答案 0 :(得分:2)
没有lodash方法比较两个数组,如果两个数组之间有任何重复,则返回一个布尔值。有_.intersection()
,但它会返回所有重复项的数组,因此效率不高。
所以,只需编写一个简单的函数即可。我称之为containsAny()
:
function containsAny(a, b) {
return a.some(function(el) {
return b.indexOf(el) > -1;
});
}
由于Array.prototype.some()
和Array.prototype.indexOf()
从版本5开始都是JavaScript新手,因此这里有一些vanilla javascript可以在没有垫片的古老浏览器中使用:
function containsAny(a, b) {
for (var i = 0; i < a.length; i++) {
if (contains(b, el)) {
return true;
}
}
return false;
}
function contains(a, el) {
for (var i = 0; i < a.length; i++) {
if (a[i] === el) {
return true;
}
}
return false;
}
lodash版本并不比vanilla js版本简单,但在某些浏览器中它可能更快。
function containsAny(a, b) {
return _.some(a, function(el) {
return _.contains(b, el);
});
}
答案 1 :(得分:1)
正如您所提到的,比较两个数组的最直接的方法是双for循环,给您一个大约O(n ^ 2)的运行时间。就个人而言,我在javascript上生锈了,但这似乎更像是一个算法问题。
为了获得更高的效率,您可能希望使用更适合快速搜索的数据结构,例如哈希表(假设您只想知道项目是否存在于列表中)。
在这种情况下,当您向array2添加/删除项目时,您还可以在哈希表中添加/删除这些项目。当你想知道array1是否包含来自array2的任何项时,你将使用单个for循环来遍历array1中的所有项,并通过hash-tables搜索函数运行该元素,我相信它只有一个运行时O(1)。这样可以提高效率,但需要更多内存。这应该使整个算法的运行时间大约为O(n)。
-
哈希表的工作方式是基本上通过提供值的算法运行输入。然后,您的输入将存储在此值的索引处。要搜索此元素是否存在,只需通过相同的散列算法运行它并检查输出的位置。搜索函数本身应返回一个布尔值,然后您可以退出搜索函数(如果为true)。
有关HashTables的更多信息:http://www.cs.uregina.ca/Links/class-info/210/Hash/