具有嵌套对象的 Angular Material 2 DataSource 过滤器

标签 angular angular-material2

我有带 Material 2 的 Angular 4 项目,我想过滤 MatTable 中的数据。当我们过滤未嵌套的字段上的数据时,DataSource 过滤器工作正常。

this.dataSource = new MatTableDataSource([
     { orderNumber: 1, orderInfo: { type: 'ABC'}, date: '12/3/2012 9:42:39 AM'},
     { orderNumber: 3, orderInfo: { type: 'Hello' }, date: '12/2/2018 9:42:39 AM'},
]);

过滤器对 orderNumber、date 工作正常,但对 orderInfo 对象中的 type 字段工作不正常。

最佳答案

这是一个包含递归的解决方案,因此您不必对每个嵌套对象或其键/值对进行硬编码。

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

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

感谢@Sagar Kharche用于 filterPredicate 覆盖。

关于具有嵌套对象的 Angular Material 2 DataSource 过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49833315/

相关文章:

javascript - 使用 ComponentFactoryResolver 渲染 Angular Material 组件

css - 使 mat-card-image 中的所有图像大小相同但正确缩放

angular-material2 - 角 Material -更改单击的垫列表选项的颜色

Angular CDK 拖放 - 传输项目而不会丢失可见性

Angular 2 : Route data is undefined on page refresh

angular - 文件删除上传数据传输为空Angular 2

angular - 更新打开的 Angular Material 2 对话框的宽度或高度

angular - 在 Angular 2中,没有检测到 `bs-config.json`或 `bs-config.js`覆盖文件。使用精简服务器默认值?

javascript - Angular Universal 入门构建错误

angular - 更改 Angular Material datePicker 图标