Фильтр JavaScript не отфильтровывает ложное сравнение

#javascript

#javascript

Вопрос:

Итак, я пытаюсь отфильтровать массив, как показано здесь:

     let overrides = rawPluginConfig.overrides;
    console.log(overrides);
    let passes = overrides.filter(override => {
        let symbol = override.level.substring(0, 2);
        let scopeLevel = Number(override.level.substring(2));
        switch (symbol) {
            case '>=':
                if(level >= scopeLevel) return false;
                return true;
            case '==':
                if(level === scopeLevel) return false;
                return true;
        }
    });
 

Это overrides переменная:

 [
  { level: '>=50', config: { message: "Woah, you're a moderator..." } },
  { level: '>=100', config: { message: [Object] } }
]
 

И это то, что console.log(passes); регистрируется после его запуска:

 [ { level: '>=100', config: null } ]
 

Почему, если level переменная равна 51, является scopeLevel частью >=100 , первое переопределение отфильтровывается, но не второе?

Спасибо!

Комментарии:

1. Перед сравнением обязательно преобразуйте scopeLevel в число: в противном случае вы сравниваете строки, а не числа.

Ответ №1:

.filter сохраняет все, что прошло тест, поэтому в вашем случае вам просто нужно перевернуть возвраты:

 let overrides = rawPluginConfig.overrides;
    console.log(overrides);
    let passes = overrides.filter(override => {
        let symbol = override.level.substring(0, 2);
        let scopeLevel = Number(override.level.substring(2));
        switch (symbol) {
            case '>=':
                if(level >= scopeLevel) return true;
                return false;
            case '==':
                if(level === scopeLevel) return true;
                return false;
        }
    });
 

я думаю, именно так вы и хотели, поскольку теперь он регистрирует то, что вы хотите?