63 votes

Angulaire de la mise à jour de l'objet dans l'objet array

Dire que j'ai la suite du tableau d'objets, permet de le nom il itemArray;

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

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

Et j'ai un abonnement qui renvoie le résultat mis à jour de seulement 2 de code. Comment puis-je mettre à jour le tableau d'objets sans boucle à travers l'ensemble de la matrice?

Ce que je voudrais, c'est quelque chose comme l'exemple ci-dessous;

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

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

ou encore mieux, en remplacement de la totalité de l'objet;

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

Cet exemple cependant les mises à jour de la matrice en fonction de l'indice du tableau. Alors, comment puis-je mettre à jour basé sur newitem.id?

Modèle de demande en commentaire:

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

94voto

Nehal Points 8280

J'ai créé ce Plunker basé sur votre exemple que les mises à jour de l'objet est égale à newItem.id

Voici l'extrait de mes fonctions:

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

Espérons que cette aide.

41voto

Eld0w Points 456

La mise à jour directement l'élément passé en argument devrait faire le travail, mais je suis peut-être manqué quelque chose ?

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

EDIT : Si vraiment vous n'avez pas le choix, mais d'une boucle sur l'ensemble de votre tableau de mise à jour de votre article, utiliser findIndex :

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

32voto

Pedro Benevides Points 1197

Une autre approche pourrait être:

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

myList.find(item => item.id == itemUpdated.id).name = itemUpdated.name;

//point au lieu de iitem

10voto

Vishnu Sharma Points 479

Vous pouvez l'essayer aussi de remplacer un objet existant

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

3voto

sowen Points 502

Je préfère créer une carte

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

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

et alors vous pouvez simplement

this.caches[newitem.id] = newitem; 

même

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

la matrice est donc de 1999. :)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X