Рекурсивно фильтровать массив объектов в соответствии с массивом условий - PullRequest
0 голосов
/ 18 апреля 2019

У меня есть массив с объектами, которые я хочу отфильтровать в соответствии с неопределенным числом условий, переданных в качестве параметров.

Вот как я фильтрую массив a с помощью массива условий в hide ()

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 голосов
/ 18 апреля 2019

Как я могу рекурсивно повторять итерацию таким же образом?

  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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...