Как проверить, пусты ли менее 2 из 3 переменных - PullRequest
0 голосов
/ 16 января 2020

Мне нужно проверить, что есть как минимум 2 значения перед запуском скрипта, но, похоже, не может быть выполнено условие.

Когда я использую if (risForm) {..., скрипт запускается при risForm заполнен, и когда я использую if (!(risForm)) {..., сценарий запускается, если risForm пусто, но я не могу понять, как проверить, заполнены ли какие-либо 2 из трех ... Я пробовал это:

if ((!(risForm)) + (!(runForm)) + (!(angForm)) < 2) {...

вместе с многочисленными изменениями в точном форматировании / брекетинге, но это никуда меня не приведет!

Ответы [ 5 ]

3 голосов
/ 16 января 2020

Создайте массив переменных, отфильтруйте по Boolean, затем проверьте длину массива:

const forms = [risForm, runForm, angForm];
if (forms.filter(Boolean).length < 2) {
  throw new Error('Not enough forms are filled');
}
// rest of the code

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

const filledFormCount = forms.reduce((a, form) => a + Boolean(form), 0);
if (filledFormCount < 2) {
  throw new Error('Not enough forms are filled');
}
1 голос
/ 16 января 2020

Если вы можете иметь все свои переменные внутри массива, вы можете сделать

yourArray.filter(Boolean).length >= 2

Чтобы разбить его на части, давайте перепишем вышеперечисленное более подробно:

yourArray
    .filter(
        function (variable) {
            return Boolean(variable)
        }
    )
    .length >= 2

Теперь array.filter () получает каждую переменную в массиве и запускает каждую из них в качестве аргумента для функции внутри паренов, в данном случае: Boolean () . Если возвращаемое значение равно truey , переменная «фильтруется», если нет - «фильтруется». Затем он возвращает новый массив без отфильтрованных переменных.

Boolean () - это функция, которая приведет ваше значение в значение true или false. Если в переменной есть значение, он вернет true ... Но есть ловушка: он вернет false для нулей и пустых строк - остерегайтесь этого.

Наконец, мы используем .length чтобы подсчитать, сколько переменных было «отфильтровано», и, если их больше двух, вы можете продолжить работу с кодом.

Может быть, этот псевдокод может лучше проиллюстрировать его:

const variables = ['foo', undefined, 'bar'];

variables.filter(Boolean).length >= 2;

['foo', undefined, 'bar'].filter(Boolean).length >= 2;
keepIfTruthy(['foo' is truthy, undefined is falsy, 'bar' is truthy]).length >= 2;
['foo', 'bar'].length >= 2;
2 >= 2;
true;
1 голос
/ 16 января 2020

Javascript s true и false полезны здесь, потому что при приведении к числу они становятся соответственно 1 и 0. Итак ...

function foo(a,b,c) {
  const has2of3 = !!a + !!b + !!c;

  if ( has2of3 ) {
    // Do something useful here
  }

}

Одно предостережение в том, что пустые строки '' и 0 ложные, что означает, что они будут рассматриваться как отсутствующие. Если это проблема, вы можете сделать что-то вроде этого:

function foo(a,b,c) {
  const hasValue = x => x !== undefined && x !== null;
  const has2of3  = hasValue(a) + hasValue(b) + hasValue(c);

  if ( has2of3 ) {
    // Do something useful here
  }

}
0 голосов
/ 16 января 2020

Есть много способов решить эту проблему. Давайте попробуем с основной идеей c. Вы хотите создать повторно используемый код и что-то, что поддерживает несколько переменных, также может измениться значение условия. Это означает, что нам нужно определить массив значений формы и значение условия для проверки. Затем мы можем применить функцию для проверки условия. Итак, давайте попробуем код:

let risForm, runForm, angForm;
risForm = 'Active';
// runForm = 3;

const formValues = [risForm, runForm, angForm];
const minFilledForms = 2;

const hasValue = a => !!a && a !== undefined && a !== null;

verifyForms();

function verifyForms() {
  let filledForms = formValues.reduce((count, form) => count + hasValue(form), 0);
  if (filledForms < minFilledForms) {
    console.log(`Only ${filledForms} of ${formValues.length} forms have filled. Minimum ${minFilledForms} forms are requiered.`);
  }

  console.log('Continue...');
}
0 голосов
/ 16 января 2020

let risForm = "a",
runForm = "",
angForm = "";

let arr = [risForm, runForm, angForm]

let res = arr.filter(el => !el || el.trim() === "").length <= 1

console.log(res)
...