【问题标题】:Javascript: check if an element from an array is found in another arrayJavascript:检查数组中的元素是否在另一个数组中找到
【发布时间】:2011-03-18 18:57:11
【问题描述】:

我有两个数组:

var arr1 = ["1", "2", "3"],
    arr2 = ["2", "5", "8"];

确定 arr1 中的任何元素是否与 arr2 中的任何元素匹配的最佳方法是什么?

我正在使用 jquery,所以现在我正在循环 arr1 并调用 $.inArray(arr1[i], arr2);,但我很好奇是否有更好的方法。

编辑

如果有人对我的确切情况感到好奇,这是一个谷歌地图,我在其中循环标记以查看是否在与标记一起存储的类型中找到任何过滤类型。如果找到任何东西,我会显示标记。否则它是隐藏的。 [此代码有效 - 将很快使用大量标记进行测试]

var filters = $("#map-search :checked").map(function () {
    return this.value;
}).get(),
    markerIndex = 0;

for (markerIndex; markerIndex < AKTA.Map.markers.length; markerIndex++) {

    var marker = AKTA.Map.markers[markerIndex],
        isVisible = false;

    if (filters.length > 0) {
        var filterIndex = 0;
        for (filterIndex; filterIndex < filters.length; filterIndex++) {
            if ($.inArray(filters[filterIndex], marker.types) != -1) {
                isVisible = true;
                break;
            }
        }
    }

    marker.setVisible(isVisible);

}

【问题讨论】:

标签: javascript jquery arrays


【解决方案1】:
arr1.some(function(el) {
    return arr2.indexOf(el) > -1
});

MDC provides 以下代码适用于未实现some 的浏览器:

if (!Array.prototype.some)
{
  Array.prototype.some = function(fun /*, thisp */)
  {
    "use strict";

    if (this === void 0 || this === null)
      throw new TypeError();

    var t = Object(this);
    var len = t.length >>> 0;
    if (typeof fun !== "function")
      throw new TypeError();

    var thisp = arguments[1];
    for (var i = 0; i < len; i++)
    {
      if (i in t && fun.call(thisp, t[i], i, t))
        return true;
    }

    return false;
  };
}

【讨论】:

  • 这需要原型,不是吗?
  • @ScottE - 它在 Firefox 中可用。它可能不在其他浏览器中,但您可以在这里看到一个实现:developer.mozilla.org/en/JavaScript/Reference/Global_Objects/…
  • @Scott some 是 EcmaScript 5 中新增的 Array 方法。它是在 IE9 中实现的,而不是早期版本的 IE。
  • @Sime Vidas - 是的,indexOf 也是如此。
  • 我正在用我的 170 个地图标记的解决方案查看大约 4 毫秒,并且与您的解决方案类似,所以看起来这可能是一个过早的优化......但也许我会测试更多去看看。
【解决方案2】:

对两个数组进行排序,然后使用以下伪代码:

i=0;
j=0;
while(i<array1length && j<array2length) {
    if (array1[i]<array2[j])
        i++;
    else if (array1[i]>array2[j])
        j++;
    else
        //match!!
}

我认为,没有更快的方法可以做到这一点。

最后,如果你要匹配字符串,你可以先对它们进行哈希编码,然后只匹配哈希编码。

【讨论】:

    猜你喜欢
    • 2021-01-30
    • 2022-01-02
    • 2023-03-08
    • 2010-10-06
    • 2021-12-03
    • 1970-01-01
    • 2017-03-03
    相关资源
    最近更新 更多