У меня есть компонент и сервис:

Компонент:

класс экспорта WebUserProfileViewComponent {
    person: Person [];
    personId: число;
    constructor (params: RouteParams, private personService: PersonService) {
          
        
           this.personId = params.get ('идентификатор');
           this.persons = это. personService.getPersons ();
           console.log (this.personId);
        }
}

Сервис:

@ Injectable ()
экспорт класса PersonService {
      getPersons () {
        var person: Person [] = [
            {id: 1, firstName: 'Hans', lastName: 'Mustermann', электронная почта: 'mustermann@test.com', компания: 'Test', страна: 'DE'},
            {id: 2, firstName: 'Muster', lastName: 'Mustermann', электронная почта: 'mustermann@test.com', компания: 'test', страна: 'DE'},
            {id: 3, firstName: 'Thomas', lastName: 'Mustermann', электронная почта: 'mustermannt@tesrt.com', компания: 'test', страна: 'DE'}
        ];
          
        вернуть лиц;
      }
}

Я хочу получить элемент Person с идентификатором ('personID'). Персональный идентификатор, который я получаю от Routeparam. Для этого мне нужен цикл foreach? Но я не нашел для этого решения.

Ответы (7)

Попробуйте это

          let val = this.SurveysList.filter(xi => {
        if (xi.id == parseInt(this.apiId ? '0' : this.apiId))
          return xi.Description;
      })

      console.log('Description : ', val );

из TypeScript вы можете использовать собственный метод JS array filter ():

let filteredElements=array.filter(element => element.field == filterValue);

возвращает массив только с совпадающими элементами из исходного массива (0, 1 или более)

Ссылка: https://developer.mozilla.org/it/docs/Web/JavaScript/Reference/Global_Objects/Array/filter

Используйте этот код в своем сервисе:

return this.getReports(accessToken)
        .then(reports => reports.filter(report => report.id === id)[0]);

Вы можете комбинировать .find со стрелочными функциями и деструктуризацией.Возьмите этот пример из MDN.

const inventory = [
  {name: 'apples', quantity: 2},
  {name: 'bananas', quantity: 0},
  {name: 'cherries', quantity: 5}
];

const result = inventory.find( ({ name }) => name === 'cherries' );

console.log(result) // { name: 'cherries', quantity: 5 }

Преобразуйте структуру данных в карту, если вы часто используете этот поиск

mapPersons: Map;

// prepare the map - call once or when person array change
populateMap() : void {
    this.mapPersons = new Map();
    for (let o of this.personService.getPersons()) this.mapPersons.set(o.id, o);
}
getPerson(id: number) : Person {
    return this.mapPersons.get(id);
}

Вам необходимо использовать метод Array.filter:

this.persons =  this.personService.getPersons().filter(x => x.id == this.personId)[0];

или Array.find

this.persons =  this.personService.getPersons().find(x => x.id == this.personId);

Предположим, у меня есть массив ниже:

Skins[
    {Id: 1, Name: "oily skin"}, 
    {Id: 2, Name: "dry skin"}
];

Если мы хотим получить предмет с Id = 1 и Name = "жирная кожа", мы попробуем, как показано ниже:

var skinName = skins.find(x=>x.Id == "1").Name;

Результат вернет скинName - «Жирная кожа».

enter image description here

2022 WebDevInsider