AngularTS рекурсивный фильтр на вложенном массиве - PullRequest
0 голосов
/ 14 октября 2018

У меня есть проблема, которая требует функции, которая может рекурсивно обходить вложенный массив объектов и фильтровать элементы в зависимости от того, присутствуют они в списке представлений или нет.

Например, с учетом списка:

[{
    "label": "Heading",
    "items": [{
      "label": "Subheading",
      "items": [{
          "id": "item1_priv",
          "label": "item1"
        },
        {
          "id": "item_priv2",
          "label": "item2"
        },
        {
          "label": "Subheading",
          "items": [{
            "id": "item_priv3",
            "label": "item3"
          }]
        }
      ]
    }]
  },
  {
    "label": "Heading2",
    "items": [{
      "label": "Subheading",
      "items": [{
          "id": "item_priv4",
          "label": "item4"
        },
        {
          "id": "item_priv5",
          "label": "item5"
        }
      ]
    }]
  }
]

и списка представлений:

canView = ['item1','item2','item4','item5']

Функция должна отфильтровать item3 в списке какего нет в canView.

Я уже сделал функцию, которая делает это:

public filterView(list: any[]): any {

  for (const item of list) {
    if (item.items) {
      item.items = this.filterView(item.items);
    } else {
      list = ((list.filter((i: any) => this.hasView(i.id))));
    }
  }

  return list;
}

Однако, мой вопрос: возможно ли переписать эту функцию как лямбду?используя list.filter ()?Я новичок в Angular to и Typescript, поэтому мне тяжело оборачиваться, используя фильтр (или вложенные фильтры), чтобы пройти список, основываясь на том, есть ли в нем элементы.

мое предположениебудет функцией по линиям

list.filter(item => return(item.items && this.hasView(item.items.id)))

, но это не работает в списке с динамической глубиной.Любой совет был бы оценен, поскольку у других решений подобных проблем, которые я видел, были только списки с фиксированной глубиной.

1 Ответ

0 голосов
/ 16 октября 2018

Единственное изменение, которое я бы предложил, это выполнить фильтрацию списка один раз, а не внутри цикла:

public filterView(list: any[]): any {

  for (const item of list) {
    if (item.items) {
      item.items = this.filterView(item.items);
    }
  }

  return list.filter((i: any) => this.hasView(i.id));
}

Помимо этого, учитывая, что filterView выполняет две разные вещи (фильтрация верхнего уровнясписок и мутирование дочерних списков потомков), мне кажется, что любой более краткий способ написания будет труднее понять.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...