zwei Objektarrays mit Angular 2 und TypeScript zusammenführen?

89

Ich habe die JavaScript-Fragen zu diesem Thema durchgesehen. Diese Frage bezieht sich speziell auf Angular2 mit TypeScript.

Ich versuche, die JSON-Objekte mit einem Array zu verketten.

Mein Code sieht ungefähr so ​​aus,

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

Wie kann ich verketten , data.resultsum this.resultsmit Typoskript und Winkel?

this._slugund this._nextsind auf Klasse gesetzt.

Vielen Dank.

Rivadiz
quelle

Antworten:

117

Ich denke, dass Sie eher Folgendes verwenden sollten:

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

Aus dem concat Dokument :

Die concat () -Methode gibt ein neues Array zurück, das aus dem Array besteht, auf dem es aufgerufen wird, zusammen mit den als Argumente bereitgestellten Arrays und / oder Werten.

Thierry Templier
quelle
1
Leider funktioniert das nicht mit Uint8arrays :(
Frederick Nord
Kann fehlschlagen, wenn this.results null oder undefiniert ist
Michael Freidgeim
164

Der Spread-Operator ist irgendwie cool.

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

Mit dem Spread-Operator können Sie eine erweiterte Version eines Arrays einfach in ein anderes Array einfügen.

Sie können hier über den Spread-Operator lesen.

Amsakanna
quelle
33

Mit eckigem 6 Spread Operator und Concat nicht funktionieren. Sie können es einfach lösen:

result.push(...data);
Mond
quelle
kam hierher, um nach einer Lösung zu suchen und gleichzeitig die Objektreferenz zwischen den Methoden beizubehalten. das hat perfekt funktioniert. danke
jgritten
Dadurch werden die Arrays nicht zusammengeführt, sondern es werden Daten von der zweiten zur ersten hinzugefügt. Während es die Arbeit erledigen kann, ist es etwas zu beachten, da es das ursprüngliche Array ändert.
Davor
5

Sie können auch das von ES6 empfohlene Formular verwenden:

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

Dies funktioniert, wenn Sie Ihr Array zuerst initialisieren ( public results = [];). andernfalls ersetzen ...this.results,durch ...this.results ? this.results : [],.

Hoffe das hilft

Babak
quelle
1

Versuche dies

 data => {
                this.results = [...this.results, ...data.results];
                this._next = data.next;
            }
Trilok Singh
quelle
0

Angenommen, ich habe zwei Arrays. Der erste hat Schülerdetails und der Schüler markiert Details. Beide Arrays haben den gemeinsamen Schlüssel '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 },
];

Ich möchte die beiden Arrays basierend auf dem Schlüssel 'studentId' zusammenführen. Ich habe eine Funktion zum Zusammenführen der beiden Arrays erstellt.

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

Hier ist der Code, um das Endergebnis zu erhalten

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}
]
Yogesh Waghmare
quelle