【问题标题】:For-loop inside filter method doesn't work as expected过滤器方法内部的for循环无法按预期工作
【发布时间】:2021-07-31 15:13:09
【问题描述】:

我使用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
    }
}));

我在循环中做错了什么?

【问题讨论】:

  • if 条件的大括号在哪里?
  • @M.HassanNasir 它只有一行,所以不需要花括号
  • 它是否返回错误?或者只是一个错误的过滤值?你能展示你的结果吗?
  • @RyanGarde 没有返回任何错误,整个表值显示正常,过滤错误
  • 你想达到什么目的?在您的第一个代码中,您正在比较列名“状态”,这很好,但在第二个代码中,您将所有标题与“拒绝”进行比较,这让我感到困惑,因为有名称或年龄之类的标题(我不知道到底是什么你的标题,我只是在猜测)。您比较除状态之外的其他标题没有意义

标签: javascript typescript ag-grid


【解决方案1】:

改为使用 map 进行迭代

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;
}));

【讨论】:

  • 现在试试解决方案,
  • 此代码永远不会返回checkDeclined = false
  • @adiga 为什么?上面的代码有什么问题?
  • @mazin 无论条件如何,它都在设置checkDeclined = true
  • @adiga 哦,是的,我把它放在 if-else 里面
【解决方案2】:

你的代码有一个逻辑错误:一旦第一列的headerName不是'Declined',它总是会返回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
}));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-09
    • 1970-01-01
    相关资源
    最近更新 更多