scalić dwie tablice obiektów za pomocą Angular 2 i TypeScript?

92

Przeszedłem przez pytania JavaScript na ten temat, to pytanie dotyczy w szczególności Angular2 z TypeScript.

Próbuję połączyć obiekty json z tablicą.

Mój kod wygląda mniej więcej tak,

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

Jak mogę łączyć data.resultssię this.resultsz maszynopisem i kątowym?

this._slugi this._nextsą nastawione na klasę.

dzięki.

Rivadiz
źródło

Odpowiedzi:

122

Myślę, że powinieneś raczej użyć następujących:

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

Z concat dokumentu :

Metoda concat () zwraca nową tablicę składającą się z tablicy, na której jest wywoływana, połączoną z tablicami i / lub wartościami podanymi jako argumenty.

Thierry Templier
źródło
1
niestety, to nie działa z Uint8arrays :(
Frederick Nord
Może się nie powieść, jeśli ten wynik jest zerowy lub niezdefiniowany
Michael Freidgeim
172

Operatora rozpiętość jest trochę ochłodzenia.

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

Operator spreadu umożliwia łatwe umieszczenie rozszerzonej wersji tablicy w innej tablicy.

Możesz przeczytać o operatorze spreadu tutaj.

Amsakanna
źródło
35

Z operatorem kątowym 6 i concat nie działają. Możesz to łatwo rozwiązać:

result.push(...data);
Księżyc
źródło
przyszedł tutaj, szukając rozwiązania przy zachowaniu odniesienia do obiektu między metodami. to działało idealnie. dziękuję
jgritten
To nie powoduje scalenia tablic, ale dodaje dane z drugiej do pierwszej. Chociaż może to wykonać, należy zachować ostrożność, ponieważ modyfikuje oryginalną tablicę.
Davor
5

Możesz także skorzystać z formularza rekomendowanego przez ES6:

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

Działa to, jeśli najpierw zainicjujesz swoją tablicę ( public results = [];); w przeciwnym razie zamień ...this.results,na ...this.results ? this.results : [],.

Mam nadzieję że to pomoże

Babak
źródło
2

Spróbuj tego

 data => {
                this.results = [...this.results, ...data.results];
                this._next = data.next;
            }
Trilok Singh
źródło
0

Załóżmy, że mam dwie tablice. Pierwsza zawiera dane ucznia, a uczeń ocenia szczegóły. Obie tablice mają wspólny klucz, czyli „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 },
];

Chcę połączyć dwie tablice na podstawie klucza „studentId”. Stworzyłem funkcję do scalania dwóch tablic.

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

oto kod, aby uzyskać wynik końcowy

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
źródło