根据条件数组递归过滤对象数组

时间:2019-04-18 05:33:25

标签: javascript typescript ecmascript-6

我有一个数组,其中包含要根据作为参数传递的不确定条件数进行过滤的对象。

这是我用hide()中的条件数组过滤数组a的方法

const statuses = [
  {
    id: 0,
    name: 'archived'
  },
  {
    id: 1,
    name: 'coming',
    hide: (...filterParam) => filterParam.every(rule => rule)
  }
];

const filteredStatuses = statuses.filter(element => {
  switch (element.id) {
    case 1:
      return !element.hide(this.isTopTabs());
    // other cases with others logic
    default:
      return true;
  }
});

现在,如果每个对象都可以有自己的子对象数组,如下所示:

const statuses = [
  {
    id: 'statuses',
    name: 'treeName',
    children: [
      {
        id: 1,
        name: 'inProgress',
        hide: (...filterParam) => filterParam.every(Boolean)
      },
      {
        id: 2,
        name: 'coming',
        checked: false,
        hide: (...filterParam) => filterParam.every(Boolean)
      }
    ]
  }
];

如何以相同的方式递归迭代?

您是否有更好的方法通过避免切换/大小写来动态过滤此数组?

最后,如何使用诸如<T>(...filterParam: Array<T>) => filterParam.every(Boolean)之类的通用类型键入其余参数?

1 个答案:

答案 0 :(得分:0)

  

如何以相同的方式递归迭代?

  const filterRecursively = elements => filterStatuses(elements).map(it => ({ ...it, children: it.children && filterRecursively(it.children) }));
  

您是否有更好的方法通过避免切换/大小写来动态过滤此数组?

为什么? switch案例有什么问题?花式还不够吗?

  

最后是如何使用类似hide的泛型键入其余参数:(... filterParam:Array)=> filterParam.every(Boolean)吗?

  <T>(...filterParam: Array<T>) => boolean