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é?
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);
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).
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);
};