об’єднати два масиви об’єктів з Angular 2 та TypeScript?


91

Я переглядав питання JavaScript щодо цієї теми, це питання стосується Angular2 з TypeScript.

Я намагаюся об’єднати об’єкти json у масив.

Мій код виглядає приблизно так,

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

Як я можу об’єднатись data.resultsу this.resultsмашинопис та angular?

this._slugі this._nextвстановлюються на клас.

Дякую.

Відповіді:


121

Я думаю, що вам слід скористатися наступним:

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

З concat документа :

Метод concat () повертає новий масив, що складається з масиву, на якому він викликаний, приєднаний до масиву (масивів) та / або значення (значень), наданих як аргументи.


1
на жаль, це не працює з Uint8arrays :(
Фредерік Норд

Може зазнати невдачі, якщо this.results є нульовим або невизначеним
Michael Freidgeim


35

З кутовим 6 оператором розкидання та concat не працюють. Ви можете вирішити це просто:

result.push(...data);

прийшов сюди шукати рішення, зберігаючи посилання на об’єкт між методами. це спрацювало чудово. дякую
jgritten

Це не об’єднує масиви, воно додає дані з другого в перший. Незважаючи на те, що він може виконати цю роботу, слід бути обережним, оскільки він змінює вихідний масив.
Давор,

5

Ви також можете скористатися формою, рекомендованою ES6:

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

Це працює, якщо спочатку ініціалізувати свій масив ( public results = [];); в іншому випадку замінити ...this.results,на ...this.results ? this.results : [],.

Сподіваюся, це допомагає



0

Припустимо, у мене є два масиви. Перший містить деталі студента, а студент позначає деталі. Обидва масиви мають спільний ключ, тобто '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 },
];

Я хочу об'єднати два масиви на основі ключа 'studentId'. Я створив функцію об’єднання двох масивів.

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

ось код для отримання кінцевого результату

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}
]
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.