web-dev-qa-db-fra.com

Comment supprimer un objet d'un tableau avec une propriété correspondante?

Tenez compte des données suivantes:

food = {
  id: 1,
  name: 'Pizza',
  price: 16
};

orders = [
  { food_id: 2, table_id: 5 },
  { food_id: 2, table_id: 5 },
  { food_id: 1, table_id: 5 },
  { food_id: 3, table_id: 5 },
  { food_id: 1, table_id: 5 }
];

Je souhaite supprimer un seul élément du tableau commandes correspondant à food_id. Voici ce que j'ai essayé:

removeFoodOrder(food: Food): void {
  for (let order of this.orders) {
    let match = this.orders.filter((order) => order.food_id == food.id);
    match ? this.orders.splice(this.orders.indexOf(order), 1) : null;
    break;
  }
  console.log(this.orders);
}

Si j'appelle removeFoodOrder(food), il supprime le premier élément du tableau, quel que soit l'aliment que je passe dans les paramètres.

removeFoodOrder(food) 
// removes {food_id: 2, table_id: 5} (the first element)
// I want to remove {food_id: 1, table_id: 5},

Je veux cibler l'élément correspondant du tableau et en supprimer une instance nique. Où est-ce que je me suis trompé?

11
anonym

Vous pouvez utiliser Array#filter méthode:

food = {
  id: 1,
  name: 'Pizza',
  price: 16
};

orders = [
  { food_id: 2, table_id: 5 },
  { food_id: 2, table_id: 5 },
  { food_id: 1, table_id: 5 },
  { food_id: 3, table_id: 5 },
  { food_id: 1, table_id: 5 }
];

removeFoodOrder = (food: Food): void => {
  this.orders = this.orders.filter(order => order.food_id !== food.id);        
}

Modifier:

Étant donné que votre tableau autorise les éléments en double et que vous souhaitez supprimer uniquement la première correspondance, vous pouvez utiliser le Array#findIndex méthode:

const index = orders.findIndex(order => order.food_id === food.id);
orders.splice(index, 1);
26
developer033

La première étape pour moi est toujours de supprimer tout ce qui prête à confusion comme cet opérateur ternaire et votre stmt de pause. Voici comment je l'ai fait

let food = {
  id: 1,
  name: 'Pizza',
  price: 16
}

let orders = [
    {food_id: 2, table_id: 5},
    {food_id: 2, table_id: 5},
    {food_id: 1, table_id: 5},
    {food_id: 3, table_id: 5},
    {food_id: 1, table_id: 5}
]

for (let order of this.orders) {
    if (food.id === order.food_id) {
        this.orders.splice(this.orders.indexOf(order), 1);
        break;
    }
}
console.log(this.orders);

Je déconseille d'utiliser le filtre Array # si vous ne savez pas à 100% comment l'utiliser.

UPDATE Je ne dis pas de ne pas utiliser la méthode de filtrage Array #. Je dis simplement que si votre code ne fonctionne pas, vous devriez essayer de supprimer tout ce qui pourrait être à l'origine de votre problème et essayer de le résoudre étape par étape à l'aide de constructions simples (comme une boucle for et if stmt).

1
Gab

Essaye ça:

function removeFoodOrder(food: Food): void
{
    for (let order of this.orders) {
        if (order.food_id == food.id) {
            this.orders.splice(this.orders.indexOf(order), 1);
            break;
        }      
    }
    console.log(this.orders);
};
1
Girisha