对多个字段进行数组过滤

dns*_*_nx 5 javascript arrays filter reactjs

我有这段代码,它可以过滤我的数据。我问我,是否有一种方法可以不显式过滤每个字段(idmandantzonenlogik...)。也许有一种更流畅的方法可以在所有字段上设置过滤器而无需显式调用它们?

let filteredList = this.state.freights.filter((freight) => {

    if (freight.id.toLowerCase().indexOf(this.state.search.toLowerCase()) !== -1) {
        return freight;
    }
    if (freight.mandant.toLowerCase().indexOf(this.state.search.toLowerCase()) !== -1) {
        return freight;
    }
    if (freight.zonenlogik.toLowerCase().indexOf(this.state.search.toLowerCase()) !== -1) {
        return freight;
    }
    if (freight.frachtart_nr.toLowerCase().indexOf(this.state.search.toLowerCase()) !== -1) {
        return freight;
    }
    if (freight.transportart_nr.toLowerCase().indexOf(this.state.search.toLowerCase()) !== -1) {
        return freight;
    }
    if (freight.spedit_nr.toLowerCase().indexOf(this.state.search.toLowerCase()) !== -1) {
        return freight;
    }
    if (freight.spedit2_nr.toLowerCase().indexOf(this.state.search.toLowerCase()) !== -1) {
        return freight;
    }
    if (freight.lager_nr.toLowerCase().indexOf(this.state.search.toLowerCase()) !== -1) {
        return freight;
    }
});
Run Code Online (Sandbox Code Playgroud)

Shu*_*tri 5

You can fetch the object values using Object.values() and then loop over those to check whether a substring is present in the string and then return the filtered object

let filteredList = this.state.freights.filter((freight) => {
    let search = this.state.search.toLowerCase();
    var values = Object.values(freight);
    var flag = false
    values.forEach((val) => {
      if(val.toLoweCase().indexOf(search) > -1) {
           flag = true;
           return;
       }
     }
     if(flag) return freight
});
Run Code Online (Sandbox Code Playgroud)

  • 只是一个小更新,您不能对非字符串值使用 toLowerCase() ,因此您应该进行测试以确保 if 块中有一个字符串,以便 indexOf 只是为了安全起见,并且您有“toLoweCase”,它应该是“为小写”。 (2认同)