165 votes

fusionner deux tableaux d'objets avec Angular 2 et TypeScript ?

J'ai parcouru les questions sur JavaScript à ce sujet, cette question concerne spécifiquement Angular2 avec TypeScript.

Ce que j'essaie de faire est de concaténer les objets json dans un tableau.

Mon code ressemble à quelque chose comme ceci,

public results: [];

public getResults(){
    this._service.get_search_results(this._slug, this._next).subscribe(
            data => {
                this.results.concat(data.results);
                this._next = data.next;
            },
            err => {
                console.log(err);
            }
        );
}

Comment puis-je concaténer data.results à this.results avec typescript et angular ?

this._slug et this._next sont fixés sur la classe.

Merci.

303voto

Amsakanna Points 4161

Le site opérateur de diffusion est plutôt cool.

this.results = [ ...this.results, ...data.results];

L'opérateur d'étalement vous permet de placer facilement une version étendue d'un tableau dans un autre tableau.

Vous pouvez lire l'article sur l'opérateur d'écart ici.

149voto

thierry templier Points 998

Je pense que vous devriez plutôt utiliser ce qui suit :

data => {
  this.results = this.results.concat(data.results);
  this._next = data.next;
},

De la concat doc :

La méthode concat() renvoie un nouveau tableau composé du tableau sur lequel elle est appelée et du ou des tableaux et/ou valeurs fournis comme arguments.

1 votes

Malheureusement, cela ne fonctionne pas avec les Uint8arrays :(

1 votes

Peut échouer si this.results est null ou indéfini.

77voto

MooN Points 9

Avec un angle de 6 opérateur de diffusion et concat ne fonctionne pas. Vous pouvez le résoudre facilement :

result.push(...data);

1 votes

Je suis venu ici pour chercher une solution tout en maintenant la référence de l'objet entre les méthodes. ceci a parfaitement fonctionné. merci.

3 votes

Cette méthode ne fusionne pas les tableaux, elle ajoute les données du second tableau au premier. Bien que cette méthode puisse faire l'affaire, il faut s'en méfier car elle modifie le tableau d'origine.

11voto

Yogesh Waghmare Points 496

Supposons que j'ai deux tableaux. Le premier contient les détails de l'étudiant et le détails sur les notes des élèves. Les deux tableaux ont une clé commune, à savoir "studentId

let studentDetails = [
  { studentId: 1, studentName: 'Sathish', gender: 'Male', age: 15 },
  { studentId: 2, studentName: 'kumar', gender: 'Male', age: 16 },
  { studentId: 3, studentName: 'Roja', gender: 'Female', age: 15 },
  {studentId: 4, studentName: 'Nayanthara', gender: 'Female', age: 16},
];

let studentMark = [
  { studentId: 1, mark1: 80, mark2: 90, mark3: 100 },
  { studentId: 2, mark1: 80, mark2: 90, mark3: 100 },
  { studentId: 3, mark1: 80, mark2: 90, mark3: 100 },
  { studentId: 4, mark1: 80, mark2: 90, mark3: 100 },
];

Je veux fusionner les deux tableaux en fonction de la clé 'studentId'. J'ai créé une fonction pour fusionner les deux tableaux.

const mergeById = (array1, array2) =>
    array1.map(itm => ({
      ...array2.find((item) => (item.studentId === itm.studentId) && item),
      ...itm
    }));

Voici le code pour obtenir le résultat final

let result = mergeById(studentDetails, studentMark ) ;

[
{"studentId":1,"mark1":80,"mark2":90,"mark3":100,"studentName":"Sathish","gender":"Male","age":15},{"studentId":2,"mark1":80,"mark2":90,"mark3":100,"studentName":"kumar","gender":"Male","age":16},{"studentId":3,"mark1":80,"mark2":90,"mark3":100,"studentName":"Roja","gender":"Female","age":15},{"studentId":4,"mark1":80,"mark2":90,"mark3":100,"studentName":"Nayanthara","gender":"Female","age":16}
]

8voto

Babak Points 443

Vous pouvez également utiliser la forme recommandée par ES6 :

data => {
  this.results = [
    ...this.results,
    data.results,
  ];
  this._next = data.next;
},

Cela fonctionne si vous initialisez d'abord votre tableau ( public results = []; ) ; sinon, remplacez ...this.results, par ...this.results ? this.results : [], .

J'espère que cela vous aidera

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