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: '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;
      }
}

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.


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

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


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

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 }


4

Verwenden Sie diesen Code in Ihrem Dienst:

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

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 );
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.