2017-05-22 38 views
6

Giả sử tôi có mảng đối tượng sau, đặt tên cho nó là itemArray;Đối tượng cập nhật góc trong mảng đối tượng

{ 
    "totalItems": 2, 
    "items": [ 
    { 
     "id": 1, 
     "name": "foo" 

    }, 
    { 
     "id": 2, 
     "name": "bar" 
    }, 
    ] 
} 

Và tôi có đăng ký trả về kết quả cập nhật chỉ có id 2. Làm cách nào để cập nhật mảng đối tượng mà không lặp qua toàn bộ mảng?

Điều tôi muốn là một ví dụ như ví dụ bên dưới;

updateUser(user){ 
    this.myservice.getUpdate(user.id) 
    .subscribe(newitem => { 
     this.updateArray(newitem); 
    }); 
} 

    updateArray(newitem){ 
    this.itemArray.items[newitem.id].name = newitem.name 
    } 

hoặc thậm chí tốt hơn, thay thế toàn bộ đối tượng;

updateArray(newitem){ 
    this.itemArray.items[newitem.id] = newitem 
    } 

Ví dụ này tuy nhiên cập nhật mảng dựa trên chỉ mục của mảng. Vì vậy, làm thế nào để tôi thay vì cập nhật dựa trên newitem.id?

Mẫu yêu cầu trong bình luận:

<tr *ngFor="let u of itemsArray.items; let i = index"> 
    <td>{{ u.id }}</td> 
    <td>{{ u.name }}</td> 
    <td> 
    <input type="checkbox" checked="u.accepted" [(ngModel)]="itemsArray.items[i].accepted" (ngModelChange)="updateUser(u)"> 
    <label for="singleCheckbox-{{i}}"></label> 
    </td> 
</tr> 
+0

Bạn đang sử dụng đối tượng này để hiển thị các kết quả từ một vòng lặp trên itemArray này (bằng id của 2)? Những gì tôi nhận được tại, là bạn có thể chỉ cần viết một đường ống tùy chỉnh cho bộ lọc này? – JSess

+0

* "Ví dụ này tuy nhiên cập nhật mảng dựa trên chỉ mục của mảng. Vì vậy, làm thế nào để tôi thay vì cập nhật dựa trên newitem.id?"*. Tại sao bạn không muốn cập nhật một mục từ một chỉ mục? Nó chắc chắn sẽ nhanh hơn vòng lặp mảng tìm kiếm một id cụ thể ... – developer033

+0

cập nhật từ chỉ mục sẽ ổn. Làm cách nào tôi có thể tìm thấy chỉ mục phù hợp? Bây giờ chỉ mục không tương ứng với newitem.id – phicon

Trả lời

8

Tôi đã tạo ra này Plunker dựa trên ví dụ của bạn mà cập nhật các đối tượng bằng newItem.id

Sau đây là đoạn các chức năng của tôi:

showUpdatedItem(newItem){ 
    let updateItem = this.itemArray.items.find(this.findIndexToUpdate, newItem.id)); 

    let index = this.itemArray.items.indexOf(updateItem); 


    this.itemArray.items[index] = newItem; 

    } 

    findIndexToUpdate(newItem) { 
     return newItem.id === this; 
    } 

Hy vọng điều này sẽ giúp.

+0

Lỗi đánh máy nhỏ ở cuối dòng thứ hai.)); nên là); – Preston

+0

tuyệt vời! chỉ một phần tôi đang bối rối là làm thế nào để làm mới mảng trên màn hình. – tCoe

5

Đang cập nhật trực tiếp các mục đã qua như là đối số phải thực hiện công việc, nhưng tôi có thể thiếu cái gì ở đây?

updateItem(item){ 
    this.itemService.getUpdate(item.id) 
    .subscribe(updatedItem => { 
    item = updatedItem; 
    }); 
} 

EDIT: Nếu bạn thực sự không có lựa chọn nào khác để lặp qua toàn bộ mảng của bạn để cập nhật hàng của bạn, sử dụng findIndex:

let itemIndex = this.items.findIndex(item => item.id == retrievedItem.id); 
this.items[itemIndex] = retrievedItem; 
2

Tôi thà tạo ra một bản đồ

export class item{ 
    name: string; 
    id: string 
} 

let caches = new Map<string, item>(); 

và sau đó bạn có thể chỉ đơn giản là

this.caches[newitem.id] = newitem; 

thậm chí

this.caches.set(newitem.id, newitem); 

mảng rất 1999. :)

0

Bạn có thể hãy thử điều này cũng để thay thế đối tượng hiện

toDoTaskList = [ 
       {id:'abcd', name:'test'}, 
       {id:'abcdc', name:'test'}, 
       {id:'abcdtr', name:'test'} 
       ]; 

newRecordToUpdate = {id:'abcdc', name:'xyz'}; 
this.toDoTaskList.map((todo, i) => { 
     if (todo.id == newRecordToUpdate .id){ 
      this.toDoTaskList[i] = updatedVal; 
      } 
     }); 
0

cách tiếp cận khác có thể là:

let myList = [{id:'aaa1', name: 'aaa'}, {id:'bbb2', name: 'bbb'}, {id:'ccc3', name: 'ccc'}]; 
let itemUpdated = {id: 'aaa1', name: 'Another approach'}; 

myList.find(iitem => item.id == itemUpdated.id).name = itemUpdated.name; 
Các vấn đề liên quan