2016-06-22 38 views
37

Ho un componente e un Servizio:angolare 2 dattiloscritto come trovare elemento in Array

Componente:

export class WebUserProfileViewComponent { 
 
    persons: Person []; 
 
    personId: number; 
 
    constructor(params: RouteParams, private personService: PersonService) { 
 
      
 
     
 
      this.personId = params.get('id'); 
 
      this.persons = this. personService.getPersons(); 
 
      console.log(this.personId); 
 
     } 
 
}

Servizio:

@Injectable() 
 
export class PersonService { 
 
     getPersons(){ 
 
     var persons: Person[] = [ 
 
      {id: 1, firstName:'Hans', lastName:'Mustermann', email: '[email protected]', company:'Test', country:'DE'}, 
 
      {id: 2, firstName:'Muster', lastName:'Mustermann', email: '[email protected]', company:'test', country:'DE'}, 
 
      {id:3, firstName:'Thomas', lastName:'Mustermann', email: '[email protected]', company:'test', country:'DE'} 
 
     ]; 
 
      
 
     return persons; 
 
     } 
 
}

Voglio ottenere l'oggetto Persona con l'Id ('personID'). Il personID che ottengo da Routeparam. Per quello ho bisogno del ciclo foreach? Ma non ho trovato una soluzione per questo.

Grazie in anticipo!

+8

È possibile trovare un elemento da Id come questo persons.find (persona => person.id === personId) – tstellfe

risposta

91

è necessario utilizzare il metodo Array.filter:

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

o Array.find

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

questo è quello che stavo cercando. Grazie. – Ortiz

+0

Perché x e non x.id? –

+0

@NickN. Hai assolutamente ragione. Dovrebbe essere x.id' –

1

Utilizzare questo codice nel tuo servizio:

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

trasformare la struttura di dati a una mappa se si usa frequentemente questa ricerca

mapPersons: Map<number, Person>; 

// 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); 
} 
-1

Si supponga che ho seguito array:

Skins [

{Id: 1, Name: "oily skin"}, 
{Id: 2, Name: "dry skin"} 

];

Se vogliamo ottenere elemento con ID = 1 e Name = "la pelle grassa", cercheremo, come di seguito:

var = skinName skins.find (x => x.cd == "1 ").Nome;

Il risultato restituirà la skinName è "Pelle grassa".

Si prega di provare, grazie e miglior riguardo!

enter image description here

+0

Grazie per questo snippet di codice, che potrebbe fornire una guida limitata a breve termine. Una spiegazione appropriata [migliorerebbe notevolmente] (// meta.stackexchange.com/q/114762) il suo valore a lungo termine mostrando * perché * questa è una buona soluzione al problema e lo renderebbe più utile ai futuri lettori con altre domande simili. Per favore [modifica] la tua risposta per aggiungere qualche spiegazione, incluse le ipotesi che hai fatto. –

+0

Questo non fornisce una risposta alla domanda. Una volta che hai [reputazione] sufficiente (https://stackoverflow.com/help/whats-reputation) sarai in grado di [commentare qualsiasi post] (https://stackoverflow.com/help/privileges/comment); invece [fornisci risposte che non richiedono chiarimenti da parte del richiedente] (https://meta.stackexchange.com/questions/214173/why-do-i-need-50-reputation-to-comment-what-can- i-do-, invece). - [Dalla recensione] (/ recensione/post di bassa qualità/19044377) –