объединить два массива объектов с помощью Angular 2 и TypeScript?

92

Я рассмотрел вопросы по 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машинописному и угловому?

this._slugи this._nextнастроены на класс.

Спасибо.

Ривадиз
источник

Ответы:

122

Я думаю, что вам лучше использовать следующее:

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

Из concat документа :

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

Тьерри Темплиер
источник
1
к сожалению, с Uint8arrays это не работает :(
Фредерик Норд
Может завершиться ошибкой, если this.results имеет значение null или undefined
Майкл Фрейджейм,
35

С оператором распространения angular 6 и concat не работают. Вы можете решить это легко:

result.push(...data);
Луна
источник
пришел сюда в поисках решения, сохраняя ссылку на объект между методами. это сработало отлично. спасибо
jgritten 06
Это не объединяет массивы, а добавляет данные из второго в первый. Хотя он может выполнять свою работу, следует быть осторожным, поскольку он изменяет исходный массив.
Давор,
5

Вы также можете использовать форму, рекомендованную ES6:

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

Это работает, если вы инициализируете свой массив first ( public results = [];); в противном случае заменить ...this.results,на ...this.results ? this.results : [],.

Надеюсь это поможет

Бабак
источник
2

попробуй это

 data => {
                this.results = [...this.results, ...data.results];
                this._next = data.next;
            }
Трилок Сингх
источник
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}
]
Йогеш Вагмаре
источник