машинопись как найти внутри массива который уже есть в массиве? - PullRequest
0 голосов
/ 16 апреля 2020

Я хочу найти значение внутри массива, который уже находится внутри массива.

Чтобы привести пример моего массива:

[
    {
        ConcessionId: 1,
        ConcessionName: "Coyotes",
        KnownAs: [
          {
            TeamId: 1,
            Name: "Arizona Coyotes",
          },
          {
            TeamId: 2,
            Name: "Phoenix Coyotes",
          }
        ]
    },
    {
        ConcessionId: 2,
        ConcessionName: "Devils",
        KnownAs: [
          {
            TeamId: 3,
            Name: "Colorado Rockies",
          },
          {
            TeamId: 4,
            Name: "New-Jersey Devils",
          }
        ]
    }
]

Что я хочу, это когда я вызываю свою функцию это возвращает мне название команды. Например, если значение параметра равно 3, я хочу использовать название Колорадо Рокиз:

public getInfo(_TeamID) { 
    const concession: ConcessionInfo[] =  this.concessionList$.filter(function (x) {
      x.KnownAs.filter( (y)=> {
          y.TeamId= +_TeamID;
          return y.Name;
      })
    })

}

Я пробую так много разных способов с фильтром. Но никогда не получай ничего хорошего. Никогда не работает.

Я могу сделать двойной .foreach для каждого массива. но я думаю, что существует лучший способ, чем сделать двойной l oop.

Спасибо

Ответы [ 2 ]

2 голосов
/ 16 апреля 2020

Вместо использования метода фильтра (который на самом деле работает аналогично a для l oop), вы можете использовать forEach для обоих массивов. Для вашей текущей структуры данных другого пути нет.

getInfo = (_TeamID) => {
  let teamName = '';
  this.concessionList$.forEach(entry => {
    entry.KnownAs.forEach(team => {
      if(team.TeamId === _TeamID){
        teamName = team.Name;
        return; // break the loop.
      }
    })
  });
  return teamName;
}

Вот рабочий пример

https://stackblitz.com/edit/double-for-lopp

РЕДАКТИРОВАТЬ Если вы посмотрите на реализацию фильтра polyfill из Mozilla https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter, что эквивалентно собственной реализации фильтра, вы можете видеть, что он проходит по всему массиву так же, как forEach l oop. Разница в том, что метод filter будет возвращать новый массив на основе логического условия внутри функции обратного вызова, в то время как forEach l oop ничего не возвращает.

1 голос
/ 16 апреля 2020

Предполагается, что myArray содержит предоставленные вами данные.

Следующий код будет работать, если вы используете Typescript 3.7 и выше.

public getInfo(teamId: number): string | undefined {
    const team = this.concessionList$
      .map(concession => concession.KnownAs)
      .reduce((a, b) => a.concat(b), [])
      .find(team => team.TeamId === teamId)
    return team ? team.Name : undefined
}

Использование:

this.getInfo(3) // Colorado Rockies

Хорошо, как это работает?

Вы должны понять, что такое find. Например:

const result = [{name: 'foo', age: 1}, {name: 'bar', age: 2}]
    .find(people => people.name === 'foo')


console.log(result) // {name: 'foo', age: 1}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...