Javascript功能整理

时间:2011-12-09 21:57:58

标签: javascript jquery

下面你会看到我正在使用的javascript / jQuery函数:

            var forward = new RegExp('forward'),
                backward = new RegExp('backward'),              
                left = new RegExp('left'),      
                right = new RegExp('right');                

            if ( tweet.message.match(forward) ) {
                console.log('forward');
                body.addClass('forward');
                bodyRemoveClass();                          
            }

            if ( tweet.message.match(backward) ) {
                console.log('backward');
                body.addClass('backward');
                bodyRemoveClass();                          
            }

            if ( tweet.message.match(left) ) {
                console.log('left');
                body.addClass('left');
                bodyRemoveClass();                          
            }

            if ( tweet.message.match(right) ) {
                console.log('right');
                body.addClass('right');
                bodyRemoveClass();                          
            }                   

一切都很好,但我对它的编写方式并不是百分之百满意。 基本上它的作用是,检查给定的关键字(向前,向后,向左或向右)
在推文中(tweet.message)

我想知道是否有一种简单/清洁的方法来实现这一点。

很抱歉,但没有在线示例...

谢谢

5 个答案:

答案 0 :(得分:4)

此处无需match()Regexp一起使用。您可以使用indexOf()进行简单的字符串匹配。然后,您可以避免在开头声明所有Regexp

        if ( tweet.message.indexOf("forward") > -1) {
            console.log('forward');
            body.addClass('forward');
            bodyRemoveClass();                          
        }

        if ( tweet.message.indexOf("backward") > -1) {
            console.log('backward');
            body.addClass('backward');
            bodyRemoveClass();                          
        }

        if ( tweet.message.indexOf("left") > -1) {
            console.log('left');
            body.addClass('left');
            bodyRemoveClass();                          
        }

        if ( tweet.message.indexOf("right") > -1) {
            console.log('right');
            body.addClass('right');
            bodyRemoveClass();                          
        }               

然而,使用一系列类更完美地实现了这一点:

// Store your 4 classes in an array
var classes = ["forward","backward","left","right"];
for (var i = 0; i<classes.length; i++) {

  // Check each class appearing in the message:
  if ( tweet.message.indexOf(classes[i]) > -1) {
     console.log(classes[i]);
     body.addClass(classes[i]);
     bodyRemoveClass();                          
  }
}

答案 1 :(得分:4)

您可以使用这样的表驱动方法:

var tags = ["forward", "backward", "left", "right"];
for (var i = 0; i < tags.length; i++) {
    if (tweet.message.indexOf(tags[i]) != -1) {
        body.addClass(tags[i]);
        bodyRemoveClass();
    }
}

请记住,只要您反复重复相同的逻辑和相同的字符串,就应该找到一种方法来通过迭代表来驱动逻辑,将代码分解为一个共同的功能或某些东西阻止您反复重复代码。如今,软件开发中流行的术语是DRY(不要重复自己)。

也没有理由用正则表达式测试每个人的匹配。虽然它们在需要时非常方便,但只需要.indexOf()就可以快得多。

答案 2 :(得分:3)

function TweetMatch(classToAdd){
    if ( tweet.message.match(new RegExp(classToAdd))) {
        console.log(classToAdd);
        body.addClass(classToAdd);
        bodyRemoveClass();                          
    }
}
TweetMatch('forward');
TweetMatch('backward');
TweetMatch('left');
TweetMatch('right');

等。 (我看到其他评论者已经走了进去,让阵列迭代......取决于你想要多少方向:-D)

答案 3 :(得分:1)

通过捕获匹配的短语可以大大缩短这一点:

var match = tweet.message.match(/forward|backward|left|right/g);
for (var i = 0; match && i < match.length; i++) {
    console.log(match[i]);
    body.addClass(match[i]);
    bodyRemoveClass();
}   

每个if块中唯一不同的是要匹配的短语(与要添加的类的名称相同)。这样的重复可以(而且应该)几乎总是可以避免。

答案 4 :(得分:1)

var directions = new Array('forward', 'backward', 'left', 'right');
$(directions).each(function()
{
    var regX = new RegExp(this);
    if (tweet.message.match(regX))
    {
        console.log(this);
        body.addClass(this);
        bodyRemoveClass();
    }
});