150 votes

Angular 2 TypeScript comment trouver un élément dans un tableau

Je possède un composant et un service :

Composant :

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

Service :

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

Je veux obtenir l'élément Personne avec l'ID (« personID »). Le personID que j'obtiens de Routeparam. Pour cela, j'ai besoin de la boucle foreach ? Mais je n'ai pas trouvé de solution pour ça.

12 votes

Vous pouvez trouver un élément par Id comme ceci persons.find(person => person.id === personId)

0 votes

0 votes

Essayer toujours d'obtenir les données à l'intérieur du crochet de cycle de vie ngOninit et non du constructeur, et essayez même les données statiques à utiliser avec Observable.

288voto

Andrei Zhytkevich Points 5310

Vous devez utiliser la méthode Array.filter:

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

ou Array.find

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

3 votes

@SaravananNandhan, la méthode this.personService.getPersons() renvoie undefined

5 votes

@AndreiZhytkevich ne devrions-nous pas utiliser triple égal ?

0 votes

@antonioplacerda, oui, cela fera l'affaire. Cependant, pour cette question, ce n'est pas trop important.

81voto

Hai Dinh Points 300

Supposons que j'ai le tableau suivant :

Skins[
    {Id: 1, Nom: "peau grasse"}, 
    {Id: 2, Nom: "peau sèche"}
];

Si nous voulons obtenir l'élément avec Id = 1 et Nom = "peau grasse", nous essayerons comme suit :

var nomPeau = skins.find(x=>x.Id == "1").Nom;

Le résultat retournera que le nom de la peau est "peau grasse".

saisir la description de l'image ici

4 votes

Merci pour ce code snippet, qui pourrait apporter une aide limitée à court terme. Une explication adéquate améliorerait considérablement sa valeur à long terme en montrant pourquoi c'est une bonne solution au problème, et le rendrait plus utile aux lecteurs futurs ayant d'autres questions similaires. Veuillez modifier votre réponse pour ajouter une explication, y compris les hypothèses que vous avez faites.

1 votes

Comment feriez-vous cela pour un tableau initialement vide puis dynamiquement peuplé... il semble y avoir un problème lors de la compilation.... la propriété par exemple Id devient inconnue.

0 votes

Bonjour @rey_coder, je pense que nous devrions vérifier si le tableau n'est pas nul avant d'implémenter pour obtenir les éléments du tableau. Par exemple : testArray = []; testArrayItem = testArray.length>0? testArray.find(x=>x.Id== 1).Name: 'testArray null'; console.log(testArrayItem);

9voto

user2449646 Points 1

Transformez la structure de données en une map si vous utilisez fréquemment cette recherche

mapPersons: Map;

// préparer la map - appeler une fois ou lorsque le tableau de personnes 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);
}

6voto

Luke Points 82

De TypeScript, vous pouvez utiliser la méthode native JS array filter() :

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

elle renvoie un tableau ne contenant que les éléments correspondants du tableau d'origine (0, 1 ou plusieurs)

Référence : https://developer.mozilla.org/it/docs/Web/JavaScript/Reference/Global_Objects/Array/filter

4voto

Anuj Shaubhari Points 39

Utilisez ce code dans votre service :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X