mesclar duas matrizes de objeto com Angular 2 e TypeScript?

93

Eu examinei as questões de JavaScript neste tópico, esta questão é especificamente sobre Angular2 com TypeScript.

O que estou tentando fazer é concatenar os objetos json em uma matriz.

Meu código se parece com isso,

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

Como posso concatenar data.resultspara this.resultscom texto datilografado e angular?

this._sluge this._nextsão definidos na aula.

obrigado.

Rivadiz
fonte

Respostas:

125

Acho que você deve usar o seguinte:

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

Do concat doc :

O método concat () retorna uma nova matriz composta da matriz na qual é chamado, junto com a (s) matriz (s) e / ou valor (es) fornecidos como argumentos.

Thierry Templier
fonte
1
infelizmente, isso não funciona com Uint8arrays :(
Frederick Nord
Pode falhar se this.results for null ou undefined
Michael Freidgeim
176

O operador de propagação é bem legal.

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

O operador de propagação permite que você coloque facilmente uma versão expandida de um array em outro array.

Você pode ler sobre o operador spread aqui.

Amsakanna
fonte
36

Com operador angular 6 spread e concat não funciona. Você pode resolver isso facilmente:

result.push(...data);
Lua
fonte
veio aqui em busca de uma solução, mantendo a referência de objeto entre os métodos. isso funcionou perfeitamente. obrigado
jgritten
Isso não mescla os arrays, mas adiciona dados do segundo ao primeiro. Embora possa fazer o trabalho, é algo com que se ter cuidado, pois modifica o array original.
Davor
5

Você também pode usar o formulário recomendado pelo ES6:

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

Isso funciona se você inicializar seu array primeiro ( public results = [];); caso contrário, substitua ...this.results,por ...this.results ? this.results : [],.

Espero que isto ajude

Babak
fonte
2

tente isso

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

Suponha que eu tenha dois arrays. O primeiro contém os detalhes do aluno e o aluno marca os detalhes. Ambas as matrizes têm a chave comum, que é '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 },
];

Quero mesclar os dois arrays com base na chave 'studentId'. Eu criei uma função para mesclar as duas matrizes.

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

aqui está o código para obter o resultado 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}
]
Yogesh Waghmare
fonte