Вложенные циклы jQuery - как это можно сделать лучше? - PullRequest
0 голосов
/ 18 марта 2011

Я создаю библиотеку, которую я унаследовал, и наткнулся на этот маленький кусочек:

queries = urlParams.query.split("&");

// Split URL Queries
$.each(queries, function (i, val) {
    val = val.split("=");
    args[val[0]] = val[1];  //Assign query args into args object using their name (ie: test=123) as the key
});

// Loop through arguments
$.each(args, function (i, val) {
// Loop through affiliates to compare url arguments against those of the affiliates
    $.each(self.affiliates, function (inc, value) {
        if (value.urlTag === i) {
        self.setAffiliateCookies(i, val, 1);    //Set affiliate cookies
            gotAff = true;
            return false;
        }
    });
});

Суть того, что происходит выше, заключается в том, что она анализирует строку запроса и разбивает элементы на значение ключапар.Достаточно просто.

Что происходит после этого, так это то, что он перебирает этот новый массив и затем проверяет, существует ли значение args в литеральном значении объекта self.affiliates.urlTag.Если это так, он устанавливает cookie, устанавливает gotAff в true, а затем возвращает false, чтобы убить $.each.

Что-то в этом не кажется мне эффективным.Я играл с рекурсивной функцией, и я не совсем там, и я не уверен, что я иду по неверному пути.Я не уверен, что убийство $.each с возвращением false также является наиболее эффективным методом.

Есть мысли?Какие-нибудь советы?Такая схема повторяется в нескольких местах, и мне бы хотелось узнать, как лучше ее выполнить.

Ответы [ 2 ]

1 голос
/ 18 марта 2011

Если я правильно понимаю структуры данных, это может быть немного чище:

$.each(self.affiliates, function (inc, value) {
    if (args.hasOwnProperty(value.urlTag)) {
        self.setAffiliateCookies(value.urlTag, args[value.urlTag], 1);    //Set affiliate cookies
        gotAff = true;
        return false;
    }
});
0 голосов
/ 18 марта 2011

Я почти уверен, что независимо от того, что это за операция n², вы должны просмотреть каждый аргумент и посмотреть, присутствует ли он в списке. Лучшее, что вы можете сделать в этом случае, это как-то прояснить код, но я не совсем уверен, что у вас есть правильные функции для этого в jQuery.

В качестве примера, вот как я бы это сделал в MooTools:

// Create array of affiliate URL tags.
var affiliateURLs = self.affiliates.map(function(affiliate) {
    return affiliate.urlTag;
});

// Filter args list to those with affiliates.
// This is the n² part.
var matchedArgs = Object.filter(args, function(arg, argURL) {
    return affiliateURLs.contains(argURL);
});

// Create cookie for each matched arg.
Object.each(matchedArgs, function(arg, argURL) {
    self.setAffiliateCookies(argURL, arg, 1);
});

// Note that gotAff is simply
// (Object.getLength(matchedArgs) > 0)
...