使用loadash或一些本机方法检查array1是否包含array2中的任何元素?

时间:2015-08-02 02:32:38

标签: javascript underscore.js lodash

我知道我可以编写自定义循环,将array1和每个元素indexOf写入另一个数组。

但我正在尝试制作游戏。我可以看到自己遇到很多情况,我不得不一遍又一遍地编写相同的代码。因此,我认为使用一些实用程序库是个好主意。现在我的想法是lodash。但是,我要先学习它。

那么我如何轻松地比较两个数组,如果任何元素匹配另一个元素中的任何元素,则返回true。

2 个答案:

答案 0 :(得分:2)

没有lodash方法比较两个数组,如果两个数组之间有任何重复,则返回一个布尔值。有_.intersection(),但它会返回所有重复项的数组,因此效率不高。

所以,只需编写一个简单的函数即可。我称之为containsAny()

ES5

function containsAny(a, b) {
    return a.some(function(el) {
        return b.indexOf(el) > -1;
    });
}

ES4

由于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

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/