Метод внутреннего фильтра для цикла работает не так, как ожидалось

#javascript #typescript #ag-grid

Вопрос:

Я использую filter метод для фильтрации массива следующим образом:

 this.gridOptions.api.setRowData(
    this.arrayToFilter.filter(obj => obj.status !== "Declined")
);
 

Приведенный выше код работает нормально, но когда я пытаюсь перебрать все поля столбцов таблицы, это не работает, вот мой код:

 this.gridOptions.api.setRowData(this.arrayToFilter.filter(function(item) {
    for(var i = 0; i < columns.length; i  ) {
        var temp = columns[i].headerName
        if(item[temp] === 'Declined')
            return false
        return true
    }
}));
 

Что я делаю не так в цикле?

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

1. где находятся фигурные скобки условия if?

2. @M. HassanNasir в нем всего одна строка, поэтому ему не нужны фигурные скобки

3. Возвращает ли он ошибку? Или просто неправильно отфильтрованные значения? Можете ли вы показать свой результат?

4. @RyanGarde он не возвращает никаких ошибок, все значения таблицы отображаются как обычно, неправильная фильтрация

5. Чего вы пытаетесь достичь? В вашем первом коде вы сравниваете название столбца «статус», что хорошо, но во втором коде вы сравниваете все свои заголовки с «Отклонено», что меня смущает, так как есть заголовки, такие как Имя или Возраст (я не знаю, каковы именно ваши заголовки, я просто догадываюсь). Вы сравниваете другие заголовки, кроме статуса, не имеет смысла

Ответ №1:

В вашем коде есть логическая ошибка: как только имя заголовка первого столбца не будет «Отклонено», оно всегда будет возвращать значение true.

Поместите return true блок за пределы цикла.

 this.gridOptions.api.setRowData(this.arrayToFilter.filter(function(item) {
    for(var i = 0; i < columns.length; i  ) {
        var temp = columns[i].headerName
        if(item[temp] === 'Declined')
            return false
    }
    return true
}));
 

Ответ №2:

Вместо этого используйте карту для итерации

 this.gridOptions.api.setRowData(this.arrayToFilter.filter(function(item) {
    let checkDeclined = true;
    columns.map(column => {
        let temp = columns[i].headerName
        if(item[temp] === 'Declined')
            checkDeclined = false
        else
            checkDeclined = true
    })
    return checkDeclined;
}));
 

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

1. Попробую решение сейчас,

2. Этот код никогда не вернется checkDeclined = false

3. @адига, почему? что не так в приведенном выше коде?

4. @mazin это установка checkDeclined = true , независимо от условий

5. @адига, о да, я положил его внутрь, если-еще