hợp nhất hai mảng đối tượng với Angular 2 và TypeScript?


92

Tôi đã xem qua các câu hỏi JavaScript về chủ đề này, câu hỏi này đặc biệt là về Angular2 với TypeScript.

Những gì tôi đang cố gắng làm là nối các đối tượng json vào một mảng.

Mã của tôi trông giống như thế này,

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

Làm thế nào tôi có thể nối data.resultsđến this.resultsvới nguyên cảo và góc?

this._slugthis._nextđược thiết lập trên lớp.

cảm ơn.

Câu trả lời:


123

Tôi nghĩ rằng bạn nên sử dụng những thứ sau:

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

Từ concat tài liệu :

Phương thức concat () trả về một mảng mới bao gồm mảng mà nó được gọi là được nối với (các) mảng và / hoặc (các) giá trị được cung cấp dưới dạng đối số.


1
thật không may, điều đó không hoạt động với Uint8arrays :(
Frederick Nord

Có thể thất bại nếu điều này. Kết quả là null hoặc không xác định
Michael Freidgeim


35

Với toán tử trải rộng góc 6 và concat không hoạt động. Bạn có thể giải quyết nó dễ dàng:

result.push(...data);

đến đây để tìm kiếm một giải pháp trong khi duy trì tham chiếu đối tượng giữa các phương thức. điều này đã hoạt động hoàn hảo. cảm ơn bạn
viết

Điều này không hợp nhất các mảng, nó thêm dữ liệu từ mảng thứ hai vào mảng thứ nhất. Mặc dù nó có thể thực hiện công việc, nhưng đó là điều cần cẩn thận vì nó sửa đổi mảng ban đầu.
Davor

5

Bạn cũng có thể sử dụng biểu mẫu do ES6 đề xuất:

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

Điều này hoạt động nếu bạn khởi tạo mảng của mình trước ( public results = [];); nếu không thì thay thế ...this.results,bằng ...this.results ? this.results : [],.

Hi vọng điêu nay co ich


2

thử đi

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

0

Giả sử tôi có hai mảng. Đầu tiên có chi tiết học sinh và học sinh đánh dấu chi tiết. Cả hai mảng đều có khóa chung, đó là '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 },
];

Tôi muốn hợp nhất hai mảng dựa trên khóa 'studentId'. Tôi đã tạo một hàm để hợp nhất hai mảng.

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

đây là mã để có được kết quả cuối cùng

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}
]
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.