fusionar dos matrices de objetos con Angular 2 y TypeScript?

91

He revisado las preguntas de JavaScript sobre este tema, esta pregunta es específicamente sobre Angular2 con TypeScript.

Lo que estoy tratando de hacer es concatenar los objetos json en una matriz.

Mi código se parece a esto,

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

¿Cómo puedo concatenar data.resultsa this.resultsla mecanografiado y angulares?

this._slugy this._nextse ponen en clase.

Gracias.

Rivadiz
fuente

Respuestas:

121

Creo que deberías usar más bien lo siguiente:

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

Del concat doc :

El método concat () devuelve una nueva matriz compuesta por la matriz en la que se llama junto con la (s) matriz (s) y / o valor (s) proporcionados como argumentos.

Thierry Templier
fuente
1
desafortunadamente, eso no funciona con Uint8arrays :(
Frederick Nord
Puede fallar si this.results es nulo o indefinido
Michael Freidgeim
35

Con operador de propagación angular 6 y concat no funciona. Puedes resolverlo fácilmente:

result.push(...data);
Luna
fuente
vino aquí buscando una solución manteniendo la referencia de objeto entre los métodos. esto funcionó perfectamente. gracias
jgritten
Esto no fusiona las matrices, agrega datos del segundo al primero. Si bien puede hacer el trabajo, es algo de lo que hay que tener cuidado, ya que modifica la matriz original.
Davor
5

También puede utilizar el formulario recomendado por ES6:

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

Esto funciona si inicializa su matriz primero ( public results = [];); de lo contrario, reemplace ...this.results,por ...this.results ? this.results : [],.

Espero que esto ayude

Babak
fuente
2

prueba esto

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

Supongamos que tengo dos matrices. El primero tiene detalles del estudiante y el estudiante marca detalles. Ambas matrices tienen la clave común, que es '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 },
];

Quiero fusionar las dos matrices basadas en la clave 'studentId'. He creado una función para fusionar las dos matrices.

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

aquí está el código para obtener el 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
fuente