删除重复代码

时间:2012-07-10 22:42:39

标签: javascript loops refactoring

如果没有所有重复,我将如何编写此代码

    // I have a loop which decrements m each time
    // set m to the starting point
    m = mid
    // set f to a calculated array value
    f = dict[l].substr( l * --m, l )
    while (f.substr(0,x) === word && (!limit || matches.length < limit)){
        matches.push(f);
        // same as what was defined outside the while loop
        // which seems to me like unnecessary repetition
        f = dict[l].substr( l * --m, l )
    }
    // then I repeat it all, but incrementing m
    // reset m to the starting point
    m = mid
    f = dict[l].substr( l * m++, l )
    while (f.substr(0,x) === word && (!limit || matches.length < limit)){
        matches.push(f);
        f = dict[l].substr( l * m++, l )
    }

有两个部分......

  1. 每个块包含重复的f = ...部分
  2. 重复这些块,只更改m
  3. 的增量/减量

    编辑:代码的作用......

    mid表示按字母顺序排序的固定长度单词列表中的任意入口点,没有分隔符。我的目标是列出所有匹配set前缀的单词,因此必须找到任意mid点后面的所有单词(由二进制搜索方法输入)并且还要转发。


    编辑:更多细节......

    字典看起来像这样:

    dict = [
      "", // offset other values to equal word length
      "ai",    // all length 1
      "inatonuptogo",    // all length 2
      "catcrydogendgodhamhathit",    // all length 3
      "foodhackhallhandhardhatehatshavehellridewood" // all length 4
    ]
    

    l是搜索字词的字长,因此dict[l]是字典中的一行,长度为l

    我正在修改John Resig's binary search method,以便它匹配前缀而不是整个单词,并返回一组结果,而不是真值。我也在那里设置了一个限制,因为我将使用它来实现自动完成功能,它只需要几个返回值,而不是所有匹配。

3 个答案:

答案 0 :(得分:2)

您可以将循环拉入函数中,因为除了递增/递减之外,它们是相同的:

function helperFunction(m, f, l, mid, dict, matches, limit, increment)
{
    m = mid;

    if (increment)
        f = dict[l].substr(l * m++, l);
    else f = dict[l].substr(l * --m, l);

    while (f.substr(0, x) === word && (!limit || matches.length < limit))
    {
        matches.push(f);
        f = dict[l].substr(l * m, l);

        if (increment)
            f = dict[l].substr(l * m++, l);
        else f = dict[l].substr(l * --m, l);
    }
}

我已将所有变量都包含在参数列表中,因为它们的范围不明确。

答案 1 :(得分:2)

将它放入函数中并传入delta。由于m ++向m添加+1,而m--在-1中添加-1,因此可以调用例如:

 function foo(mid, dict, delta) {
 m = mid
 //   f = dict[l].substr( l * m += delta, l )
    f = dict[l].substr( l * m, l );
    m += delta;
    while (f.substr(0,x) === word && (!limit || matches.length < limit)){
        matches.push(f);
        // f = dict[l].substr( l * m += delta, l )
        f = dict[l].substr( l * m, l );
        m += delta;
    }
    return matches;
}

matches = foo(mid, dict, -1);
matches = foo(mid, dict, +1);

我只是将匹配作为返回值,因为我不确定您的代码尝试做什么,但它应该向您展示这个想法。

答案 2 :(得分:0)

@Billy Moon,您可以在下面验证此代码吗?

function foo(flag, m) { return dict[l].substr( l * (Boolean(flag)) ? --m : m++), l ); }
var flag = 1;
do {
    m = mid
    f = foo(flag, m)
    while (f.substr(0,x) === word && (!limit || matches.length < limit)){
        matches.push(f);
        f = foo(flag, m)
    }
    flag--;
} while(flag > -1)

我希望可以帮助你。