Если еще / для циклов в JavaScript - PullRequest
0 голосов
/ 28 октября 2018

Есть ли способ сделать это утверждение if-else обобщенным.В данный момент trueArray состоит из значений от t1 до t4.Я ищу способ создания обобщенного решения для любого числа значений t5, t6 и так далее.Я не понимаю, как сказать циклу for создавать все больше и больше вложенных операторов if в зависимости от длины массива истинности.Благодарю.Пояснение к коду: Прежде всего я хочу проверить, верно ли значение t1.Если это так, то первый элемент в positionArray будет «оставлен».Теперь я хочу проверить значение t2, когда t1 уже установлено как истинное.Если t2 - true, тогда я устанавливаю второй элемент в positionArray как 'right'.После этого я хочу проверить, является ли t3 истинным, когда t1 и t2 уже истинны, и установить третий элемент positionArray как левый.Затем я проверяю, истинно ли t4, когда все t1, t2, t3 истинны и так далее.Таким образом, последовательные элементы positionArray будут вправо, затем влево, затем вправо, затем влево и так далее.Теперь, если t1 не верно, то я хочу начать тот же процесс с t2.Если t1 не верно, первый элемент массива позиции будет неопределенным.Если t1 не истинно, а t2 истинно, то второй элемент positionArray устанавливается как 'left', и последовательные элементы будут правыми, левыми, правыми и т. Д. Если t1 и t2 оба не верны, тогда процесс будетначать с т3 и тд ..

            var truthArray = [t1, t2, t3, t4]; 
            var positionArray = [];
            var i;        
  
           
            if (truthArray[0] === true) {
                positionArray[0] = 'left';
                if (truthArray[1] === true) {
                    positionArray[1] = 'right';
                    if (truthArray[2] === true) {
                        positionArray[2] = 'left';
                        if (truthArray[3] === true) {
                            positionArray[3] = 'right';
                        }
                    }
                    else if (truthArray[3] === true) {
                        positionArray[3] = 'left';
                    }
                }
                else if (truthArray[2] === true) {
                    positionArray[2] = 'right';
                    if (truthArray[3] === true) {
                        positionArray[3] = 'left';
                    }
                }
                else if (truthArray[3] === true) {
                    positionArray[3] = 'right';
                }
            }
            else if (truthArray[1] === true) {
                positionArray[1] = 'left';
                if (truthArray[2] === true) {
                    positionArray[2] = 'right';
                    if (truthArray[3] === true) {
                        positionArray[3] = 'left';
                    }
                }
                else if (truthArray[3] === true) {
                    positionArray[3] = 'right';
                }
            }
            else if (truthArray[2] === true) {
                positionArray[2] = 'left';
                if (truthArray[3] === true) {
                    positionArray[3] = 'right';
                }
            }
            else if (truthArray[3] === true) {
                positionArray[3] = 'left';
            }
            

Ответы [ 3 ]

0 голосов
/ 28 октября 2018

Таким образом, вы хотите перебрать truthValues и построить positionArray, где , если (trueValue == false) добавить undefined к positionArray , в противном случае добавить либо 'left' или 'right' до positionArray, так что 'left' и 'right' всегда чередуются?

Вот как это можно сделать.

    //fill truthArray with 10 random boolean values
    const truthArray = [];
    for (var i = 0; i < 10; i++) {
      truthArray.push(Math.random() > 0.5);
    }
    
    //calc(truthArray) and map the result (and truthInput) to make it easier to read
    const input = truthArray.map(t => t?'T':'F');
    const output = calc(truthArray).map(v => {
      if (v === 'left') return 'L';
      if (v === 'right') return 'R';
      if (v === undefined) return '-';
    });
    
    //display truthInput and result
    console.log('T is true, F is false');
    console.log('L is left, R is right, - is undefined');
    console.log(input.join());
    console.log(output.join());
    
    function calc(truthArray) {
      var trueCount = 0;
      const result = [];
      for (var truthVal of truthArray) {
        if (truthVal) {
          const position = (trueCount % 2 == 0)
            ? 'left'
            : 'right';
          result.push(position);
          trueCount++;
        } else {
          result.push(undefined);
        }
      }
      
      return result;
    }
0 голосов
/ 28 октября 2018

Вы можете просто сопоставить чек и вернуть либо переключенное значение, либо undefined.

. Он работает, проверяя значение элемента, и принимает триггер с объектоми значение pos.Это значение изменяется путем присвоения нового значения pos, принимая pos в качестве средства доступа к свойству для объекта.

rl = { right: 'left', left: 'right' }
pos = 'right';
pos = rl[pos]; // left
pos = rl[pos]; // right
pos = rl[pos]; // left
pos = rl[pos]; // right
// and so on ...

Если элемент не является truey , затем undefined сопоставляется с набором результатов.

var truthArray = [false, true, false, true],
    lr = { right: 'left', left: 'right' },
    pos = 'right',
    positionArray = truthArray.map(b => b ? pos = lr[pos] : undefined);

console.log(positionArray);
.as-console-wrapper { max-height: 100% !important; top: 0; }

Для получения другого шаблона, например

['left', 'left', 'right', 'right']

, вы можете увеличить индекс и настроить его с помощью оператора остатка и получить битовый битзначение справа, которое делит значение на 2 и возвращает целочисленное значение.

var truthArray = [true, false, true, false, true, false, true, false, true],
    lr = ['left', 'right'],
    pos = 3,
    positionArray = truthArray.map(b => b ? lr[++pos, (pos %= 4) >> 1] : undefined);

console.log(positionArray);
.as-console-wrapper { max-height: 100% !important; top: 0; }
0 голосов
/ 28 октября 2018

Надеюсь, это поможет вам, дайте мне знать, если у вас возникнут проблемы

var truthArray = [false, false, true]; 
var positionArray = [];
var positionArrayValues = ['left','right'];
var offsetArray = [];
var start = 0, end = truthArray.length;      
function traverseFurther(index,positionArrayIndex) {
    if(index === end)
        return;
    if(truthArray[index] === true) {
        positionArray[index] = positionArrayValues[positionArrayIndex];
        traverseFurther(index + 1, positionArrayIndex === 0 ? 1 : 0);
    } else {
        traverseFurther(index + 1,positionArrayIndex);
    }
}
traverseFurther(start, 0);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...