Почему функции Array Prototype не работают внутри другой функции массива, как для каждой? - PullRequest
0 голосов
/ 04 марта 2020

У меня есть следующая проблема, мне нужно извлечь некоторые значения из другого массива во время итерации.

Но в рамках каждой операции массив теряет все свои функции-прототипы.


const allCrumbs: BreadCrumb[] = this.createBreadcrumbs(this.activatedRoute.root);

last.url.split('/').forEach((segment: string) => {
            if (segment !== '#') {
                // This is the part that doesn work within the array
    // Edit forgot null check here 
                const label = allCrumbs.find(value => value.url.endsWith(segment)).label;
                // allCrumbs.find(...) is not defined

                this.breadCrumbs.push({label: label ? label : segment, url: `/${segment}`});
            }
        });
    // This works just fine
    const testlabel = allCrumbs.find(value => value.url.endsWith('test')).label;

, когда я делаю это, ошибка:

allCrumbs.find (...) не определена

append.

Когда я делаю то же самое за пределами массива Other, он работает нормально.

Может кто-нибудь объяснить это поведение? И, возможно, дать подсказку к решению.

Большое спасибо:

Решение

Забыли нулевую проверку, спасибо.

теперь это работает

last.url.split('/').forEach((segment: string) => {
            if (segment !== '#') {

                const result = allCrumbs.find(value => value.url.endsWith(segment));

                this.breadCrumbs.push({label: result ? result.label : segment, url: `/${segment}`});
            }
        });

Позор мне. Но спасибо всем за терпение

1 Ответ

2 голосов
/ 04 марта 2020

Проблема в том, что ваш .find() не находит ничего на основе вашего предиката. Поэтому он возвращает undefined.

Вместо этого ожидайте, что он может вернуть undefined и обрабатывать соответственно. Сначала попытайтесь найти соответствующее значение:

const crumb = allCrumbs.find(value => value.url.endsWith(segment));

А затем, в зависимости от того, какую версию Angular (и, следовательно, Typescript) вы используете, вы можете использовать необязательное сцепление или троичное выражение для получения метки .

Angular> = v9

const label = crumb?.label;

Angular

const label = crumb ? crumb.label : '';
const allCrumbs: BreadCrumb[] = this.createBreadcrumbs(this.activatedRoute.root);

last.url.split('/').forEach((segment: string) => {
  if (segment !== '#') {
    const crumb = allCrumbs.find(value => value.url.endsWith(segment));
    const label = crumb ? crumb.label : '';
    this.breadCrumbs.push({
      label: label ? label : segment, 
      url: `/${segment}`
    });
  }
});
...