Angular 2 TypeScript come trovare l'elemento in Array


131

Ho un componente e un servizio:

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: 'mustermann@test.com', company:'Test', country:'DE'},
            {id: 2, firstName:'Muster', lastName:'Mustermann', email: 'mustermann@test.com', company:'test', country:'DE'},
            {id:3, firstName:'Thomas', lastName:'Mustermann', email: 'mustermannt@tesrt.com', company:'test', country:'DE'}
        ];
          
        return persons;
      }
}

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


11
Puoi trovare un elemento di Id come questo persons.find (person => person.id === personId)
tstellfe

Risposte:


255

Devi usare 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);

2
@SaravananNandhan, this.personService.getPersons()restituisce il metodoundefined
Andrei Zhytkevich

4
@AndreiZhytkevich non dovremmo usare il triplo uguale?
antonioplacerda

@antonioplacerda, sì, va bene. Tuttavia, per questa domanda non è troppo importante.
Andrei Zhytkevich

1
All'inizio quel codice sembra criptico per me, ma potrebbe essere utile leggere "find (x => x.id == this.personId" come "find x, dove l'ID di x è uguale a questo ID persona" Non so di altri persone, ma per me questo è molto più facile da ricordare.
Rizki Hadiaturrasyid

69

Supponiamo di avere sotto l'array:

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

Se vogliamo ottenere un oggetto con Id = 1e Name = "oily skin", proveremo come di seguito:

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

Il risultato restituirà skinName "Pelle grassa".

Per favore, prova, grazie e cordiali saluti!

inserisci qui la descrizione dell'immagine


4
Grazie per questo snippet di codice, che potrebbe fornire un aiuto limitato a breve termine. Una spiegazione adeguata migliorerebbe notevolmente il suo valore a lungo termine mostrando perché questa è una buona soluzione al problema e la renderebbe più utile per i futuri lettori con altre domande simili. Si prega di modificare la risposta di aggiungere qualche spiegazione, tra le ipotesi che hai fatto.
Toby Speight

1
Come lo faresti per un array inizialmente vuoto e poi popolato dinamicamente ... sembra che ci sia un problema durante la compilazione .... la proprietà ad es. Id diventa sconosciuta.
rey_coder

Ciao @rey_coder, penso che dovremmo controllare se array non è nullo prima di implementarlo per ottenere gli elementi degli elementi dell'array. Come: testArray = []; testArrayItem = testArray.length> 0? testArray.find (x => x.Id == 1) .Name: 'testArray null'; console.log (testArrayItem);
Hai Dinh

1
Ciao @ hai-dinh, questo ha risolto il problema. Grazie.
rey_coder

9

Trasforma la struttura dei dati in una mappa se utilizzi spesso 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);
}

8

Un'ottima opzione non ancora menzionata è quella di utilizzare la combinazione .findcon le funzioni delle frecce e la destrutturazione. Prendi questo esempio da 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 }


4

Usa questo codice nel tuo servizio:

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

1

Prova questo

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

      console.log('Description : ', val );
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.