使用 lodash 或某些本机方法检查 array1 是否包含数组中的任何元素?
check if array1 contains any element from array2, using loadash or some native method?
我知道我可以编写采用 array1
的自定义循环,并对每个元素执行 indexOf
到另一个数组。
但我正在尝试制作游戏。我可以看到自己 运行 遇到很多情况,在这些情况下我被迫一遍又一遍地编写相同的代码。因此,我认为使用一些实用程序库是个好主意。现在我的想法是 lodash
。不过,我得先学习一下。
那么我如何轻松比较两个数组,并且 return 如果任何元素与另一个元素中的任何元素匹配则为真。
没有比较两个数组的 lodash 方法,returns 如果两个数组之间有任何重复项,则为布尔值。有 _.intersection()
,但是 returns 一个包含所有重复项的数组,因此效率不高。
所以,写一个简单的函数就可以了。我称之为 containsAny()
:
es5
function containsAny(a, b) {
return a.some(function(el) {
return b.indexOf(el) > -1;
});
}
es4
由于 Array.prototype.some()
和 Array.prototype.indexOf()
都是 JavaScript 版本 5 的新功能,这里有一些香草 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
lodash 版本并不比 vanilla js 版本简单,尽管它在某些浏览器中可能更快。
function containsAny(a, b) {
return _.some(a, function(el) {
return _.contains(b, el);
});
}
正如您所提到的,比较两个数组的最直接方法是双 for 循环,为您提供大约 O(n^2) 的 运行 时间。就我个人而言,我对 javascript 感到生疏,但这似乎更像是一个算法问题。
为了获得更高的效率,您可能希望使用更适合快速搜索的数据结构,例如散列 table(假设您只想知道该项目是否存在于列表中根本)。
在这种情况下,当您 add/delete 项目到 array2 时,您也在散列 table 中 add/delete 这些项目。当您想知道 array1 是否包含 array2 中的任何项目时,您可以使用单个 for 循环遍历 array1 中的所有项目和 运行 通过 hash-tables 搜索函数的元素,我相信只有 运行 的 O(1) 时间。这将使它更有效率,但需要更多内存。这将使您的整个算法的 运行 时间大约为 O(n)。
--
哈希 table 的工作原理基本上是 运行 通过一种为其提供值的算法来处理您的输入。然后,您的输入将存储在此值的索引中。要搜索此元素是否存在,您只需通过相同的散列算法 运行 它并检查输出的位置。搜索函数本身应该 return 一个布尔值,然后您可以退出搜索函数(如果为真)。
关于哈希表的更多信息:http://www.cs.uregina.ca/Links/class-info/210/Hash/
我知道我可以编写采用 array1
的自定义循环,并对每个元素执行 indexOf
到另一个数组。
但我正在尝试制作游戏。我可以看到自己 运行 遇到很多情况,在这些情况下我被迫一遍又一遍地编写相同的代码。因此,我认为使用一些实用程序库是个好主意。现在我的想法是 lodash
。不过,我得先学习一下。
那么我如何轻松比较两个数组,并且 return 如果任何元素与另一个元素中的任何元素匹配则为真。
没有比较两个数组的 lodash 方法,returns 如果两个数组之间有任何重复项,则为布尔值。有 _.intersection()
,但是 returns 一个包含所有重复项的数组,因此效率不高。
所以,写一个简单的函数就可以了。我称之为 containsAny()
:
es5
function containsAny(a, b) {
return a.some(function(el) {
return b.indexOf(el) > -1;
});
}
es4
由于 Array.prototype.some()
和 Array.prototype.indexOf()
都是 JavaScript 版本 5 的新功能,这里有一些香草 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
lodash 版本并不比 vanilla js 版本简单,尽管它在某些浏览器中可能更快。
function containsAny(a, b) {
return _.some(a, function(el) {
return _.contains(b, el);
});
}
正如您所提到的,比较两个数组的最直接方法是双 for 循环,为您提供大约 O(n^2) 的 运行 时间。就我个人而言,我对 javascript 感到生疏,但这似乎更像是一个算法问题。
为了获得更高的效率,您可能希望使用更适合快速搜索的数据结构,例如散列 table(假设您只想知道该项目是否存在于列表中根本)。
在这种情况下,当您 add/delete 项目到 array2 时,您也在散列 table 中 add/delete 这些项目。当您想知道 array1 是否包含 array2 中的任何项目时,您可以使用单个 for 循环遍历 array1 中的所有项目和 运行 通过 hash-tables 搜索函数的元素,我相信只有 运行 的 O(1) 时间。这将使它更有效率,但需要更多内存。这将使您的整个算法的 运行 时间大约为 O(n)。
--
哈希 table 的工作原理基本上是 运行 通过一种为其提供值的算法来处理您的输入。然后,您的输入将存储在此值的索引中。要搜索此元素是否存在,您只需通过相同的散列算法 运行 它并检查输出的位置。搜索函数本身应该 return 一个布尔值,然后您可以退出搜索函数(如果为真)。
关于哈希表的更多信息:http://www.cs.uregina.ca/Links/class-info/210/Hash/