Angular 2 TypeScript, wie man ein Element in Array findet

131

Ich habe eine Komponente und einen Service:

Komponente:

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

Bedienung:

@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;
      }
}

Ich möchte das Personenelement mit der ID ('personID') erhalten. Die PersonID, die ich von Routeparam bekomme. Dafür brauche ich die foreach-Schleife? Aber ich habe keine Lösung dafür gefunden.

Falle
quelle
11
Sie können ein Element durch ID wie dieses finden person.find (person => person.id === personId)
tstellfe

Antworten:

255

Sie müssen folgende Methode anwenden Array.filter:

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

oder Array.find

this.persons =  this.personService.getPersons().find(x => x.id == this.personId);
Andrei Zhytkevich
quelle
2
@ SaravananNandhan, Methode this.personService.getPersons()kehrt zurückundefined
Andrei Zhytkevich
4
@AndreiZhytkevich sollten wir nicht Triple Equals verwenden?
Antonioplacerda
@antonioplacerda, ja, das wird reichen. Für diese Frage ist es jedoch nicht zu wichtig.
Andrei Zhytkevich
1
Zuerst scheint mir dieser Code kryptisch zu sein, aber es könnte hilfreich sein, "find (x => x.id == this.personId" als "find x, wobei xs ID gleich dieser Personen-ID ist" zu lesen. Ich weiß nichts über andere Leute, aber für mich ist das viel einfacher zu merken.
Rizki Hadiaturrasyid
69

Angenommen, ich habe unten Array:

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

Wenn wir Artikel mit Id = 1und erhalten möchten, Name = "oily skin"versuchen wir Folgendes:

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

Das Ergebnis gibt den SkinName "Fettige Haut" zurück.

Bitte probieren Sie es aus, danke und viel Respekt!

Geben Sie hier die Bildbeschreibung ein

Hai Dinh
quelle
4
Vielen Dank für dieses Code-Snippet, das möglicherweise nur begrenzte kurzfristige Hilfe bietet. Eine richtige Erklärung würde ihren langfristigen Wert erheblich verbessern, indem sie zeigt, warum dies eine gute Lösung für das Problem ist, und es für zukünftige Leser mit anderen, ähnlichen Fragen nützlicher machen. Bitte bearbeiten Sie Ihre Antwort, um eine Erklärung hinzuzufügen, einschließlich der von Ihnen getroffenen Annahmen.
Toby Speight
1
Wie würden Sie dies für ein Array tun, das anfangs leer und dann dynamisch gefüllt ist? Beim Kompilieren scheint ein Problem aufgetreten zu sein. Die Eigenschaft, z. B. ID, wird unbekannt.
Rey_coder
Hallo @rey_coder, ich denke, wir sollten überprüfen, ob das Array nicht null ist, bevor wir es implementieren, um die Elementelemente des Arrays abzurufen. Wie: testArray = []; testArrayItem = testArray.length> 0? testArray.find (x => x.Id == 1) .Name: 'testArray null'; console.log (testArrayItem);
Hai Dinh
1
Hi @ hai-dinh, das hat das Problem gelöst. Vielen Dank.
Rey_coder
9

Transformieren Sie die Datenstruktur in eine Karte, wenn Sie diese Suche häufig verwenden

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);
}
rharari
quelle
8

Eine nette Option, die noch nicht erwähnt wurde, ist die Kombination .findmit Pfeilfunktionen und Destrukturierung. Nehmen Sie dieses Beispiel aus 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 }
Nathan Beck
quelle
4

Verwenden Sie diesen Code in Ihrem Dienst:

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

Versuche dies

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

      console.log('Description : ', val );
Ammad Khan
quelle