Angular Material 2 DataSource filter with nested object

前端 未结 3 1206
无人共我
无人共我 2020-12-28 15:14

I have angular 4 project with material 2, I want to filter the data in MatTable. DataSource filter is working fine when we filter data on field which are not nested.

<
相关标签:
3条回答
  • 2020-12-28 15:25

    This is a very generic solution and will work for sure. It does not depends on the structure of json, be it simple or nested, this solution works for all.

    this.dataSource.filterPredicate = (data: any, filter) => { const dataStr =JSON.stringify(data).toLowerCase(); return dataStr.indexOf(filter) != -1; }

    0 讨论(0)
  • 2020-12-28 15:29

    Here is a solution that incorporates recursion so you don't have to hard code each nested object or their key/value pairs.

    this.dataSource.filterPredicate = (data, filter: string)  => {
      const accumulator = (currentTerm, key) => {
        return this.nestedFilterCheck(currentTerm, data, key);
      };
      const dataStr = Object.keys(data).reduce(accumulator, '').toLowerCase();
      // Transform the filter by converting it to lowercase and removing whitespace.
      const transformedFilter = filter.trim().toLowerCase();
      return dataStr.indexOf(transformedFilter) !== -1;
    };
    

    And the nestedFilterCheck

    nestedFilterCheck(search, data, key) {
      if (typeof data[key] === 'object') {
        for (const k in data[key]) {
          if (data[key][k] !== null) {
            search = this.nestedFilterCheck(search, data[key], k);
          }
        }
      } else {
        search += data[key];
      }
      return search;
    }
    

    Thanks to @Sagar Kharche for the filterPredicate override.

    0 讨论(0)
  • 2020-12-28 15:42

    DataSource has filterPredicate() method that needs to override in our application as follows. Add this code in your component after data source initialization.

    this.dataSource.filterPredicate = (data, filter: string)  => {
      const accumulator = (currentTerm, key) => {
        return key === 'orderInfo' ? currentTerm + data.orderInfo.type : currentTerm + data[key];
      };
      const dataStr = Object.keys(data).reduce(accumulator, '').toLowerCase();
      // Transform the filter by converting it to lowercase and removing whitespace.
      const transformedFilter = filter.trim().toLowerCase();
      return dataStr.indexOf(transformedFilter) !== -1;
    };
    
    0 讨论(0)
提交回复
热议问题