嵌套的jQuery循环 - 如何才能更好地完成?

时间:2011-03-18 04:01:12

标签: javascript jquery recursion nested-loops

我正在修建一个我继承的图书馆并遇到了这个小小的问题:

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

关于这一点对我来说似乎不是很有效。我一直在玩一个递归函数,我不在那里,我不确定我是否走错了路。我不确定使用返回false来查找$.each也是最有效的方法。

有什么想法?有小费吗?这种模式在多个地方重复,我很想知道如何更好地完成它。

2 个答案:

答案 0 :(得分:1)

如果我理解正确的数据结构,这可能会更清洁:

$.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;
    }
});

答案 1 :(得分:0)

我很确定无论它是什么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)