优化JavaScript循环

时间:2016-11-15 20:15:56

标签: javascript optimization

我在Google表格中有一个学生数据库,其中包含许多迟到的实例。当他们达到5,8或11个迟到时,他们会记录纪律处分。纪律处分在以下三栏中注明了5,8和11个迟到:

| Stu name | # tardies | 5 cons | 8 cons | 11 cons| |-------------|-----------|---------|----------|--------| | Joe Doe | 5 | 1/2 ISS | | | | Mark Dark | 5 | | | | | Steve Leave | 8 | 1/2 ISS | Full ISS | |

循环采用目标tardies数并比较#tardies列。如果迟到次数的结果列为空白,则会返回stu数组。

现在,循环运行,但它真的很笨重。我可以采取哪些措施来优化嵌套if语句的运行方式吗?

for(var i=0;i<data.length;i++) {
    var stu = [data[i][0], data[i][1]];
    if(target === 5) {
      if(data[i][3] === 5 && data[i][4] == 0) {
        array.push(stu);
      }
    } else if(target === 8) {
      if(data[i][3] === 8 && data[i][5] == 0) {
        array.push(stu);
      }
    } else if(target === 12) {
      if(data[i][3] === 12 && data[i][6] == 0) {
        array.push(stu);
      }
    } 

3 个答案:

答案 0 :(得分:0)

只是移出你的条件,这只是3个条件?   像这样:

  for(var i=0;i<data.length;i++) {
        var stu = [data[i][0], data[i][1]];
        if(target === 5 && data[i][3] === 5 && data[i][4] == 0) {
            array.push(stu);
        } else if(target === 8 && data[i][3] === 8 && data[i][5] == 0) {
            array.push(stu);
        } else if(target === 12 && data[i][3] === 12 && data[i][6] == 0) {
            array.push(stu);
        } 

答案 1 :(得分:0)

事实上,由于目标未在for循环中被修改,你甚至可以将其移出:

var onTarget = {
    5: function(data, array){
        for(var i=0;i<data.length;i++) {
            if(data[i][3] === 5 && data[i][4] == 0){
                array.push(stu)
            }
        }
    },
    8: function(data, array){
        for(var i=0;i<data.length;i++) {
            if(data[i][3] === 8 && data[i][5] == 0){
                array.push(stu)
            }
        }
    }
}
if(target in onTarget){
    onTarget[target](data, array);
}

它有点冗长,而且代码重复,所以你现在可以在索引上玩...

var targetToColumnUplet = {
    5: {value:5, blankIndex: 4}
    8: {value:8, blankIndex: 5}
}

if(target in targetToColumnUplet){
    var uplet = targetToColumnUplet[target];
    for(var i=0;i<data.length;i++) {
        var stu = [data[i][0], data[i][1]];
        if(data[i][3] === uplet.value && data[i][uplet.blankIndex] == 0) {
            array.push(stu);
        }
    }
}

答案 2 :(得分:-1)

你可以尝试这样的事情。

for(var i=0;i<data.length;i++) {
    var stu = [data[i][0], data[i][1]];
    var d3 = data[i][3];
    switch(d3){
        case 5:
           if(data[i][4] === 0){
               array.push(stu);
           } 
           break;
        case 8:
           if(data[i][5] === 0){
               array.push(stu);
           } 
           break;
        case 12:
           if(data[i][6] === 0){
               array.push(stu);
           } 
           break;
    }
}