Если заявление с несколькими условиями не работает - PullRequest
0 голосов
/ 29 октября 2018

У меня такой петелька:

for (var i = 0; i < this.bucket_names.length; i++) { 
       if(this.bucket_names[i].criterium){
            bucketName = this.bucket_names[i].criterium;
        } else {
            bucketName = this.bucket_names[i];
        }


        console.log(bucketName, i, bucketName !== 'match', bucketName !== 'test');

        if (!selectedFilterDict && (bucketName !== "match" || bucketName !== "test")) {
            rawOptionData[key] = {
                terms: terms
            }
        } else if (bucketName !== "match" || bucketName !== "test"){}
}

Где я использую оператор if для проверки bucketNames в строках match, test, но это

if (!selectedFilterDict && (bucketName !== "match" || bucketName !== "test")) {}

не работает, потому что после && условие всегда выполняется, как я могу объединить эти bucketNames, чтобы позволить этому, если оператор работает?

Ответы [ 4 ]

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

Попробуйте использовать

if (!selectedFilterDict && !(bucketName == "match" || bucketName == "test")) {}
0 голосов
/ 29 октября 2018

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

bucketName !== "match" || bucketName !== "test"

Всегда будет иметь значение true, потому что одно из двух условий всегда будет true.

Если вы хотите проверить, что bucketName не соответствует ни одному из значений в данном наборе, вы можете использовать Array.prototype.includes():

const whiteListed = ['match', 'test'].includes(bucketName);

if (!selectedFilterDict && !whiteListed) {
    ...
} else if (whiteListed) {
    ...
}

Если вы хотите использовать ту же логику без использования includes, вы также можете использовать:

if (!selectedFilterDict && bucketName !== "match" && bucketName !== "test") {
    ...
}

Или:

if (!selectedFilterDict && !(bucketName === "match" && bucketName === "test")) {
    ...
}
0 голосов
/ 29 октября 2018

Полагаю, вы уже узнали, что bucketName не может быть одновременно "соответствием" и "проверкой". Итак, определите массив bucketName и проверьте, используя ! includes() для вашего состояния.

const bucketNames = ["match", "test", "exists"];
let bucketName = 'tst';
let test= !bucketNames.includes(bucketName);
console.log(test)

Для вашей кодовой базы что-то вроде ниже,

if (!selectedFilterDict && !bucket_names.includes(bucketName)) {
      rawOptionData[key] = {
      terms: terms
    }
 }
0 голосов
/ 29 октября 2018

(bucketName !== "match" || bucketName !== "test") Всегда будет возвращать true, потому что bucketName не может быть одновременно "match" и "test".

Скажем, bucketName равно "match", первая проверка bucketName !== "match" вернет false, поэтому мы перейдем ко второй проверке, которая bucketName !== "test". Поскольку bucketName уже равен "match", это вернет true. То же самое, если мы объявляем от bucketName до "test".

Если вы хотите проверить, является ли bucketName не "test" или "match", измените свой оператор if на (bucketName !== "match" && bucketName !== "test")

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