Проверьте элементы массива и посмотрите, есть ли в нем флаг, мои циклы не работают - PullRequest
0 голосов
/ 10 марта 2020

Попытка выяснить, что если элемент rxDetails содержит комбинацию внутри rxInfos флагов, основанных на этом счетчике приращения, в приведенном ниже сценарии, то он должен retVlaue false, потому что logi c из for of l oop должен быть на уровне члена, а не завершенным rxDetails объектом. что реализовано неправильно любая помощь?

main. js

const rxDetails = [
   {"member": 1 , "rxInfos":[
     { "firstFillIndicator": "Y", 
       "acceptDigitalFirstFill": "Y" }, 
         { "firstFillIndicator": "Y", 
       "acceptDigitalFirstFill": "Y" },
   ]},
    {"member": 2 , "rxInfos":[
     { "firstFillIndicator": "N", 
       "acceptDigitalFirstFill": "Y" }, 
         { "firstFillIndicator": "N", 
       "acceptDigitalFirstFill": "Y" },
   ]},  

 ]



 function validateOrderRequest(rxDetails) {
        let retVlaue = false;
        let firstFillCounter  = 0;
        let refillCounter = 0;
        for (const member of rxDetails) {
            for (const rx of member.rxInfos) {
                if (rx.firstFillIndicator === "Y" && rx.acceptDigitalFirstFill === "Y") {
                    firstFillCounter++;
                } else {
                    refillCounter++;
                }
            }
            if (refillCounter > 0 && firstFillCounter > 0) {
                retVlaue = true;
                return retVlaue;
            } else {
                retVlaue = false;
            }
        }

    return retVlaue;
   }

   console.log(validateOrderRequest(rxDetails));

Ответы [ 2 ]

1 голос
/ 10 марта 2020

Вы хотите вернуть true, если для любого заданного элемента в массиве элемент имеет:

  • Как минимум одну комбинацию из "Y", "Y"
  • По крайней мере, еще одна комбинация

Ваша проблема в том, что ваш счетчик работает от начала до конца внешнего массива. Вместо этого вы должны переместить объявления внутри первого for l oop.

В качестве альтернативы, вы можете немного упростить это, используя функцию массива some для ваших циклов.

validateOrderRequest(rxDetails) {
  return rxDetails.some(member => {
    let firstFillCounter  = 0;
    let refillCounter = 0;
    for (let i = 0; i < member.rxInfos.length; i++) {
      const rx = member.rxInfos[i];
      if (rx.firstFillIndicator === "Y" && 
          rx.acceptDigitalFirstFill === "Y") {
        firstFillCounter++;
      } else {
        refillCounter++;
      }

      if (firstFillCounter > 0 && refillCounter > 0) {
        return true;
      }
    }

    return false;
  });
}

some вернет true для первого элемента, который он найдет для условия в обратном вызове.

В этом примере внутренний l oop возвращает true, если у члена есть хотя бы один " Y "," Y "комбинация и хотя бы одна!" Y ",!" Y "комбинация.

Внешний some возвращает true, если хотя бы один член удовлетворяет этому условию.

ДЕМО: https://stackblitz.com/edit/angular-read7t

0 голосов
/ 10 марта 2020

Следующая часть выглядит подозрительно, почему вы вернетесь при выполнении одного условия, а не другого? Помните, что возврат останавливает выполнение остальной части скрипта

if (refillCounter > 0 && firstFillCounter > 0) {
    retVlaue = true;
    return retVlaue;
} else {
    retVlaue = false;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...