Могу ли я пройти через 2 объекта одновременно в JavaScript? - PullRequest
1 голос
/ 26 января 2012

относится (вроде) к этому вопросу.Я написал скрипт, который будет проходить через объект для поиска определенной строки в ссылочном 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_u20 либо передал значение из объекта searchProviders или из socialNetworksобъект.Есть ли способ, которым я могу сделать это?

РЕДАКТИРОВАТЬ: Извинения, поскольку это не было объяснено должным образом.Я пытаюсь найти в URL-адресе ссылки строку, содержащуюся в любом из двух объектов.Так, например, я делаю что-то вроде:

var mc_refURL = document.referrer +'';

И затем ищу mc_refURL один из ключей в объекте, например, "google.com", "bing.com" и т. Д. 9Это в настоящее время работает (простоодин объект).Полученный key затем передается другой функции.Что мне нужно сделать, так это поискать второй объект и вернуть это значение.Я просто слишком усложняю вещи?

Ответы [ 3 ]

1 голос
/ 26 января 2012

Если я правильно понимаю ваш вопрос, у вас есть переменная mc_refURL, которая содержит некоторый URL. Вы хотите выполнить поиск по searchProviders и socialNetworks, чтобы увидеть, существует ли этот URL-адрес как значение в каком-либо объекте, и если это так, вы хотите вызвать функцию mc_trackerReport() с именем свойства, которое соответствует этому URL-адресу.

Например, для 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 или что-то еще, вы просто добавите это в конец массива.

1 голос
/ 26 января 2012

Вы можете объединить два объекта в один перед циклом. Здесь есть несколько подходов: Как можно динамически объединять свойства двух объектов JavaScript?

var everything = searchProviders;
for (var attrname in socialNetworks) { everything[attrname] = socialNetworks[attrname]; }
for(var mc_u20 in everything) {
    // ...
}
0 голосов
/ 26 января 2012
for (var i = 0; i < mc_searchProviders.length; i++) {
    var searchProvider = mc_searchProviders[i];
    var socialNetwork = mc_socialNetworks[i];
    if (socialNetwork != undefined) {
        // Code.
    }
}

Или я что-то ужасно неправильно понимаю?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...