我可以在JavaScript中同时循环处理两个对象吗

Can I loop through 2 objects at the same time in JavaScript?

本文关键字:两个 对象 处理 JavaScript 循环 我可以      更新时间:2023-09-26

与这个问题有关(有点)。我已经编写了一个脚本,它将循环遍历一个对象,以在引用的URL中搜索某个字符串。对象如下:

var searchProviders = {
  "google": "google.com",
  "bing": "bing.com",
  "msn": "search.msn",
  "yahoo": "yahoo.co",
  "mywebsearch": "mywebsearch.com",
  "aol": "search.aol.co",
  "baidu": "baidu.co",
  "yandex": "yandex.com"
};

我用来循环的for..in循环是:

for (var mc_u20 in mc_searchProviders && mc_socialNetworks) { 
    if(!mc_searchProviders.hasOwnProperty(mc_u20)) {continue;}
    var mc_URL = mc_searchProviders[mc_u20];
    if (mc_refURL.search(mc_URL) != -1) {
        mc_trackerReport(mc_u20);
        return false;
    }

现在我有了另一个对象,让我们称之为socialNetworks,它具有以下构造:

var socialNetworks = {"facebook" : "facebook.co" }

我的问题是,我能只用一个函数循环浏览这两个对象吗?我询问的原因是,您可以看到的变量mc_u20被传递回mc_trackerReport函数,而我需要的是mc_u20searchProviders对象或socialNetworks对象传递回一个值。有没有办法让我做到这一点?

编辑:很抱歉,因为没有正确解释。我想做的是,在引用的URL中搜索包含在这两个对象中的字符串。例如,我正在做这样的事情:

var mc_refURL = document.referrer +'';

然后在mc_refURL中搜索对象中的一个键,例如"google.com""bing.com"等。9这当前有效(仅适用于一个对象)。所得到的CCD_ 11随后被传递给另一个函数。我需要做的是搜索第二个对象并返回该值。我只是把事情搞得过于复杂了吗?

如果我正确理解你的问题,你有一个变量mc_refURL,其中包含一些URL。您希望同时搜索searchProviderssocialNetworks,以查看该URL是否作为值存在于任一对象中,以及是否希望使用与该URL对应的属性名称调用mc_trackerReport()函数。

例如,对于mc_refURL === "yahoo.co",您要调用mc_trackerReport("yahoo"),而对于mc_ref_URL === "facebook.co",您需要调用mc_trackerReport("facebook")

如果两个对象中都出现相同的URL,您不会说该怎么办,所以我假设您想使用先找到的那个。

我不会创建一个具有所有属性的合并对象,因为如果在两个原始对象中出现相同的属性名称,并且每个对象中的URL不同,例如在searchProvider项目"google" : "google.co"socialNetworks项目"google" : "plus.google.com"这样的示例中,则会丢失信息。

相反,我建议制作一个包含这两个对象的数组。循环遍历该数组,并在每次迭代时运行原始循环。类似这样的东西:

var urlLists = [
       mc_searchProviders,
       mc_socialNetworks
    ],
    i,
    mc_u20;
for (i = 0; i < urlLists.length; i++) {
   for (mc_u20 in urlLists[i]) { 
      if(!urlLists[i].hasOwnProperty(mc_u20))
         continue;
      if (mc_refURL.search(urlLists[i][mc_u20]) != -1) {
         mc_trackerReport(mc_u20);
         return false;
      }
   }
}

对象数组方法是有效的,不需要复制属性或任何东西,而且如果您稍后添加另一个URL列表,比如programmingForums或其他什么,您只需将其添加到数组的末尾。

您可以在循环之前将两个对象合并为一个对象。这里有几种方法:如何动态合并两个JavaScript对象的属性?

var everything = searchProviders;
for (var attrname in socialNetworks) { everything[attrname] = socialNetworks[attrname]; }
for(var mc_u20 in everything) {
    // ...
}
for (var i = 0; i < mc_searchProviders.length; i++) {
    var searchProvider = mc_searchProviders[i];
    var socialNetwork = mc_socialNetworks[i];
    if (socialNetwork != undefined) {
        // Code.
    }
}

还是我误解了什么?