2015-10-14 2 views
0

Я пытаюсь упростить эту функцию, так как может быть множество type данных, и для каждого типа есть также мужская и женская версия. Число и имя элементов в объектах всегда одинаковы.Упростите функцию с повторяющимися частями if/else.

Как видите, большая часть кода повторяется ...

function calculate(type, j, value, s) { 
    for (var i = j; i > 4; i--) { 
     if (type == 'weight') { 
      if (s == 'f') { 
       if (weightFemale.hasOwnProperty(i)) { 
        var m = weightFemale[i][0], 
         l = weightFemale[i][1], 
         s = weightFemale[i][2];  
        return getcalc(m,l,s); 
       } 
      } 
      else { 
       if (weightMale.hasOwnProperty(i)) { 
        var m = weightMale[i][0], 
         l = weightMale[i][1], 
         s = weightMale[i][2];  
        return getcalc(m,l,s); 
       }    
      } 
     } 
     else if (type == 'length') { 
      if (s == 'f') { 
       if (lengthFemale.hasOwnProperty(i)) { 
        var m = lengthFemale[i][0], 
         l = lengthFemale[i][1], 
         s = lengthFemale[i][2], 
        return getcalc(m,l,s); 
       } 
      } 
      else { 
       if (lengthMale.hasOwnProperty(i)) { 
        var m = lengthMale[i][0], 
         l = lengthMale[i][1], 
         s = lengthMale[i][2], 
        return getcalc(m,l,s); 
       }    
      } 
     } 
    } 
    return false; 
} 

Как я могу упростить, если/иначе-части для вида и пола?

+1

, как ваш код, кажется, рабочий код, вы можете попросить об этом на codereview.stackexchange.com. что касается вопроса, то выполнение функции для повторяющихся частей может немного помочь. –

+0

Я голосую, чтобы закрыть этот вопрос как не по теме, потому что он должен быть на сайте, таком как codereview.stackexchange – rlemon

+1

Во-первых, этот код работает правильно? Потому что 's = 'f'' должно быть' s ==' f''. –

ответ

1

Поскольку вы делаете то же самое для каждого объекта, просто сделать ваш условные определить одну ссылку на объект и расчет только один раз вызова.

Что-то вроде:

var obj; 

if (type == 'weight') { 
    obj = s == 'f' ? weightFemale : weightMale; 
} else if (type == 'length') { 
    obj = s == 'f' ? lengthFemale : lengthMale; 
} 

if (obj.hasOwnProperty(i)) { 
    var m = obj[i][0], 
     l = obj[i][1], 
     s = obj[i][2]; 
    return getcalc(m, l, s); 
} 
1

Я хотел бы создать собственную функцию и создать переключатель

switch(type) { 
    case "weight": 
     getValues(); 
     break; 
    case "length": 
     getValues(); 
     break; 
} 
0

Спросите себя, какие детали, которые очень похожи? Похоже, если .hasOwnProperty() истинно, вы получаете m, l и s из массива, а затем вызываете getcalc(). Начните с извлечения этой части в функцию с передачей различных элементов в качестве параметров.

Другой шаблон - это то, что вы используете определенный массив на основе определенных условий. Получение массива, который вы хотите, можно поместить в функцию.

Кроме того, не совсем связанный с вопросом, но вы можете указать, что ваши переменные лучше имен. Это делает код более понятным и понятным.

Вот что я придумал:

function getArray(type, s){ 
    if(type == 'weight') { 
     return s == 'f' ? weightFemale : weightMale; 
    } 
    else if(type == 'length') { 
     return s == 'm' ? lengthFemale : lengthMale;  
    } 
} 


function makeCalculation(array, i) { 
    if(array.hasOwnProperty(i)) { 
     var m = lengthMale[i][0], 
      l = lengthMale[i][1], 
      s = lengthMale[i][2], 
     return getcalc(m,l,s); 
    } 
} 

function calculate(type, j, value, s) { 
    for (var i = j; i > 4; i--) { 
     var array = getArray(type, s); 
     return makeCalculation(array, i); 
    } 
} 
0

Во-первых, вы можете создать функцию, как это:

function _getcalc(arr, i) { 
    var m = arr[i][0], 
    l = arr[i][1], 
    s = arr[i][2]; 
    return getcalc(m, l, s); 
} 

Затем вы можете сократить вашу функцию как это:

function calculate(type, j, value, s) { 
    for (var i = j; i > 4; i--) { 
     switch(type) { 
      case 'weight': 
       if (s == 'f' && weightFemale.hasOwnProperty(i)) { 
        return _getcalc(weightFemale, i); 
       } else if(weightMale.hasOwnProperty(i)) { 
        return _getcalc(weightMale, i); 
       } 
       break; 
      case 'length': 
       if (s == 'f' && lengthFemale.hasOwnProperty(i)) { 
        return _getcalc(lengthFemale, i); 
       } else if(lengthMale.hasOwnProperty(i)) { 
        return _getcalc(lengthMale, i); 
       } 
       break; 
     } 
    } 
    return false; 
} 
+1

нужно 'return' в' _getcalc() ' – charlietfl

+1

Конечно, я исправил это. Спасибо. –

Смежные вопросы