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.

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.


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

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


2

prueba esto

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

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}
]
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.