Как я могу сделать большую инструкцию if / else более жесткой? - PullRequest
0 голосов
/ 03 сентября 2018

У меня есть что-то вроде следующего:

if (value === section1) {
  runChecks(checkObject[1].value1, checkObject[1].value2, leftAlign);
} else if (value === section2) {
  runChecks(checkObject[2].value1, checkObject[2].value2, rightAlign);
} else if (value === section3) {
  runChecks(checkObject[3].value1, checkObject[3].value2, leftAlign);
} else if (value === section4) {
  runChecks(checkObject[4].value1, checkObject[4].value2, rightAlign);
} else if (value === section5) {
  runChecks(checkObject[5].value1, checkObject[5].value2, leftAlign, true);
} else if (value === section6) {
  runChecks(checkObject[6].value1, checkObject[6].value2, rightAlign);
} ...

Это работает дольше, чем это, так как есть большое количество предопределенных значений.

Пример checkObject:

  var checkObject = [{
    value1: '19.1%',
    value2: '19.1%',
  }, {
   value1: '19.1%',
    value2: '19.1%',
  }, {
   value1: '19.1%',
    value2: '19.1%',
  }, ...

Я хочу разбить его и сделать его более эффективным, но, учитывая, что существуют различия в данных, передаваемых в runChecks (), я не уверен, как им управлять.

Ответы [ 6 ]

0 голосов
/ 03 сентября 2018

Вы можете использовать some с коротким замыканием, если найдено значение.

[section1, section2, section3, section4, section5, section6].some((v, i) => {
    if (v === value) {
        runChecks(
            checkObject[i + 1].value1,
            checkObject[i + 1].value2,
            i % 2 ? rightAlign : leftAlign
            i === 5 || undefined
        );
        return true;
    }
});
0 голосов
/ 03 сентября 2018

Например, можно использовать цикл.

let sections = ['section1', 'section2', 'section3', 'section4'];

for (let i = 0; i < sections.length; i++) {
    if (value === sections[i]) {
        runChecks(checkObject[1].value1, checkObject[1].value2, leftAlign);
    }
}
0 голосов
/ 03 сентября 2018

В вашем коде слишком много повторяющихся частей. Я бы сделал это так.

var scs = [null, section1, section2, section3, section4, section5, section6];
var si = scs.indexOf(value);
var align = ((si&1)==1) ? leftAlign : rightAlign;
runChecks(checkObject[si].value1, checkObject[si].value2, align, si==5);
0 голосов
/ 03 сентября 2018

Не могли бы вы перебрать массив? Возможно, вам потребуется добавить всю информацию, которая вам требуется, в функцию runChecks (я добавил mybool, так как я не был уверен, откуда исходит эта истина).

checkObject.forEach(function(value, index) {
  let alignment = index % 2 == 0 ? leftAlign : rightAlign;
  runChecks(value.value1, value.value2, alignment, value.mybool);
});
0 голосов
/ 03 сентября 2018

На самом деле, вы можете просто использовать цикл for.

Создать объект массива, содержащий все разделы. (Я предоставлю настоящий javascript позже. Но здесь есть некоторый полупсевдокод).

   var counter = 1;
    var N = something;
    var sectionArray = {section1, section2, section3, ..., sectionN};


   for(;counter<N; counter++){

   if(value === sectionArray[counter]){
  runChecks(checkObject[counter].value1, checkObject[counter].value2, rightAlign);
break;
   }

}
0 голосов
/ 03 сентября 2018

Используйте переключатель!

switch(value){
    case section1:
        runChecks(checkObject[1].value1, checkObject[1].value2, leftAlign);
    break
    case section2:
      runChecks(checkObject[2].value1, checkObject[2].value2, rightAlign);
    break
    ... 
}

Это на самом деле не короче, чем if / else if / else, но выглядит чище.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...